当前位置: 首页 > news >正文

酒店网站怎么做自媒体平台有哪些

酒店网站怎么做,自媒体平台有哪些,wordpress 首页分页,wordpress的pingsu主题文章目录 为什么需要引入B-树#xff1f;B树是什么#xff1f;B树的插入分析B树和B*树B树B*树分裂原理 B树的应用 本篇总结的内容是B-树 为什么需要引入B-树#xff1f; 回忆一下前面的搜索结构#xff0c;有哈希#xff0c;红黑树#xff0c;二分…等很多的搜索结构B树是什么B树的插入分析B树和B*树B树B*树分裂原理 B树的应用 本篇总结的内容是B-树 为什么需要引入B-树 回忆一下前面的搜索结构有哈希红黑树二分…等很多的搜索结构而实际上这样的结构对于数据量不是很大的情况是比较适用的但是假设有一组很大的数据大到已经不能在内存中存储此时应该如何处理呢可以考虑将关键字及其映射的数据的地址放到一个内存中的搜索树的节点优先考虑去这个地址处访问数据 从上面的文段中可以看出问题出现在文件的IO是有损耗的因此在使用哈希或是其他的数据结构在搜索的过程中会不断地进行文件的IO这样带来的降低效率是不建议出现的因此解决方案之一就是可以降低树的高度因此就引出了B-树多叉平衡树 B树是什么 1970年R.Bayer和E.mccreight提出了一种适合外查找的树它是一种平衡的多叉树称为B树(后面有一个B的改进版本B树然后有些地方的B树写的的是B-树一棵m阶(m2)的B树是一棵平衡的M路平衡搜索树可以是空树或者满足一下性质 根节点至少有两个孩子每个分支节点都包含k-1个关键字和k个孩子其中 ceil(m/2) ≤ k ≤ m ceil是向上取整函数每个叶子节点都包含k-1个关键字其中 ceil(m/2) ≤ k ≤ m所有的叶子节点都在同一层每个节点中的关键字从小到大排列节点当中k-1个元素正好是k个孩子包含的元素的值域划分每个结点的结构为nA0K1A1K2A2… KnAn其中Ki(1≤i≤n)为关键字且KiKi1(1≤i≤n-1)。Ai(0≤i≤n)为指向子树根结点的指针。且Ai所指子树所有结点中的关键字均小于Ki1n为结点中关键字的个数满足ceil(m/2)-1≤n≤m-1 上面的规则很复杂那么下面用图片来解释B树的插入原理并进行一次模拟 B树的插入分析 假设此时的M 3也就是这是一个三叉树那么从上面的规则来说每个节点要存储两个数据还有三个孩子节点而实际上的过程中会分别多创建一个节点也就是说会创建三个数据域和四个孩子节点这样的好处后续在实现代码的过程中会体现出来 假设现在给定了这样的一组数据53, 139, 75, 49, 145, 36, 101 图解如下 那么超过了可以容纳的数据个数该如何处理呢看B树的规则是如何处理的 B树的分裂规则 当超过了最多能容纳的数据个数后会进行分裂 找到节点数据域的中间位置创建一个兄弟节点把后一半的数据挪动到兄弟节点中把中位数的数据移动到父节点中对这些节点建立链接 此时就完成了B树的一次分裂从中就能看出B树的基本原理既然是多叉搜索树那么也要满足搜索树的规则因此采取这样的分裂规则是可以满足搜索树的要求的 继续进行插入数据按照上述的原理即可 当继续插入的时候就会产生新的分裂问题 由此得出了最终的生成图 从这个图中也能看出确实是符合搜索树的预期的那么下一步就是要把上面写的这一系列的过程转换成代码来进行实现 #include iostream using namespace std;// 定义B树节点的信息 template class K, size_t M struct BTreeNode {// 节点内部包含一个数组用来存储数据域信息和一个指针数组用来保存孩子节点信息以及双亲的信息// 还要包括节点中已经存储的数据的数量// 多开辟一个空间方便于判断是否需要进行分裂K _keys[M];BTreeNodeK, M* _subs[M 1];BTreeNodeK, M* _parent;size_t _n;BTreeNode():_parent(nullptr), _n(0){for (int i 0; i M; i){_subs[i] nullptr;_keys[i] nullptr;}_subs[M] nullptr;} };// 存储B树的信息 template class K, size_t M class BTree {typedef BTreeNodeK, M Node; public:// 查找函数找某个确定的Key值如果找到了返回它所在的节点和所处节点的位置pairNode*, int Find(const K key){Node* parent nullptr;Node* cur _root;// 开始寻找while (cur){size_t i 0;// 指针到每一层的节点后进行比较while (i cur-_n){if (key cur-_keys){// 说明此时要查找的节点信息不在这一层一定是要到下面一层去找因此跳出这一层的循环break;}else if (key cur-_keys){// 说明此时要查找的信息可能在当前查找的节点的后面还要去后面找找看i;}else{// 说明此时找到节点的信息了直接把节点的信息进行返回即可return make_pair(cur, i);}}// 说明此时这一层已经找完了现在该去下一层进行寻找了parent cur;// 由B树的性质得出subs[i]中存储的信息是比当前信息要小的树因此去这里寻找目标Key值cur cur-_subs[i];}// 运行到这里就是这个值在B树中不存在返回查找最后的层数的节点和错误值即可return make_pair(parent, -1);}// 把元素插入到表中本质上是一种插入排序void InsertKey(Node* node, const K key, Node* child){int end node-_n - 1;while (end 0){if (key node-_keys[end]){// 挪动key和他的右孩子node-_keys[end 1] node-_keys[end];node-_subs[end 2] node-_subs[end 1];--end;}else{break;}}// 把值写入到节点中node-_keys[end 1] key;node-_subs[end 2] child;// 如果有孩子节点那么要更新孩子节点的指向插入元素后双亲所在的位置发生了变化if (child)child-_parent node;node-_n;}bool Insert(const K key){// 如果_root是一个空树那么直接创建节点再把值放进去即可if (_root nullptr){_root new Node;_root-_keys[0] key;_root-_n;return true;}// 运行到这里说明这个树不是一个空树那么首先要寻找插入的节点在现有的B树中是否存在pairNode*, int ret Find(key);if (ret.second ! -1){// 键值对的第二个信息不是-1说明在B树中找到了要插入的信息这是不被允许的因此返回return false;}// 运行到这里说明要开始向B树中插入新节点了// 并且前面的ret还找到了parent也就是实际应该是插入的位置信息Node* parent ret.first;K newKey key;// 创建孩子指针的意义是后续可能会重复的进行分裂情况并且插入元素的节点中可能原先有值// 直接插入后会把原来孩子节点的双亲节点发生替换因此要改变孩子节点的指向Node* child nullptr;while (1){// 此时就找到了要插入的元素要插入的位置进行插入InsertKey(parent, newKey, child);// 如果双亲节点没有超出限制那么就说明此时插入已经完成了if (parent-_n M){return true;}else{// 运行到这里时就说明已经超过了节点能容纳的最大值此时应该进行分裂处理// 找到中间的元素size_t mid M / 2;// 把[mid 1, M - 1]分配个兄弟节点Node* brother new Node;size_t j 0;size_t i mid 1;for (; i M - 1; i){// 分裂拷贝key和key的左孩子把这些信息拷贝给兄弟节点brother-_keys[j] parent-_keys[i];brother-_subs[j] parent-_subs[i];if (parent-_subs[i])parent-_subs[i]-_parent brother;j;// 被拷贝走的元素所在的位置进行重置表明已经被拷贝走了parent-_keys[i] K();parent-_subs[i] nullptr;}// 还有最后一个右孩子拷给brother-_subs[j] parent-_subs[i];if (parent-_subs[i])parent-_subs[i]-_parent brother;parent-_subs[i] nullptr;// 更新一下原先节点和兄弟节点中的元素的个数brother-_n j;parent-_n - (brother-_n 1);K midKey parent-_keys[mid];parent-_keys[mid] K();// 说明刚刚分裂是根节点要创建一个新的根节点用来存储分裂的中位数的信息if (parent-_parent nullptr){_root new Node;_root-_keys[0] midKey;_root-_subs[0] parent;_root-_subs[1] brother;_root-_n 1;parent-_parent _root;brother-_parent _root;break;}else{// 向parent中插入一个中位数同时更新一下孩子的信息即可// 转换成往parent-parent 去插入parent-[mid] 和 brothernewKey midKey;child brother;parent parent-_parent;}}}return true;} private:Node* _root nullptr; };B树和B*树 B树 B树是B树的变形是在B树基础上优化的多路平衡搜索树B树的规则跟B树基本类似但是又在B树的基础上做了以下几点改进优化 分支节点的子树指针与关键字个数相同分支节点的子树指针p[i]指向关键字值大小在[k[i]k[i1])区间之间所有叶子节点增加一个链接指针链接在一起所有关键字及其映射数据都在叶子节点出现 B树的特性 所有关键字都出现在叶子节点的链表中且链表中的节点都是有序的不可能在分支节点中命中分支节点相当于是叶子节点的索引叶子节点才是存储数据的数据层 B*树 B*树是B树的变形在B树的非根和非叶子节点再增加指向兄弟节点的指针 分裂原理 B树的分裂 当一个结点满时分配一个新的结点并将原结点中1/2的数据复制到新结点最后在父结点中增加新结点的指针B树的分裂只影响原结点和父结点而不会影响兄弟结点所以它不需要指向兄弟的指针 B*树的分裂 当一个结点满时如果它的下一个兄弟结点未满那么将一部分数据移到兄弟结点中再在原结点插入关键字最后修改父结点中兄弟结点的关键字因为兄弟结点的关键字范围改变了如果兄弟也满了则在原结点与兄弟结点之间增加新结点并各复制1/3的数据到新结点最后在父结点增加新结点的指针 所以B*树分配新结点的概率比B树要低空间使用率更高 B树有序数组平衡多叉树 B树有序数组链表平衡多叉树 B*树一棵更丰满的空间利用率更高的B树B树的应用 B树的最常见应用就是当做索引 MySQL官方对索引的定义为索引(index)是帮助MySQL高效获取数据的数据结构简单来说索引就是数据结构 当数据量很大时为了能够方便管理数据提高数据查询的效率一般都会选择将数据保存到数据库因此数据库不仅仅是帮助用户管理数据而且数据库系统还维护着满足特定查找算法的数据结构这些数据结构以某种方式引用数据这样就可以在这些数据结构上实现高级查找算法该数据结构就是索引 mysql是目前非常流行的开源关系型数据库不仅是免费的可靠性高速度也比较快而且拥 有灵活的插件式存储引擎
http://www.dnsts.com.cn/news/76214.html

相关文章:

  • 做网站公司官网海门网站开发
  • 北京网站怎么建设广州百度快速优化排名
  • 网站开发与应用论文开办网络公司
  • 景区网站策划书有需要做网站的吗
  • 大兴网站开发网站建设宝安中心区新楼盘
  • 广渠路网站建设优易建站终身用一些难以发现的网站
  • 网站被黑客入侵怎么办北京网站建设厂家
  • 大理州建设局投诉网站湘潭网站建设设计
  • 郴州网站建设价格网络营销是干什么的啊
  • 闵行交大附近网站建设企业网站的缺点
  • 平台网站 备案吗ppt做书模板下载网站
  • 网站设计技术文章唯尚广告联盟
  • 简洁的网站深圳公司注册开户
  • 航空网站建设网页美工设计课程
  • 用wix做网站需要备案吗找人做一个网站需要花多少钱
  • 新网站建设 英文翻译iis网站正在建设中
  • 网站建设攻略咸鱼之王小程序
  • 什么网站最好替别人做网站
  • 西安北郊网站建设wordpress oop
  • 建筑业资质查询网站帮别人做彩票网站犯法嘛
  • 站长之家端口扫描高密住房和城乡建设厅网站
  • 学做网站赚钱方法浅谈网站建设的目的和意义
  • 舟山网站建设规模以上工业企业个数
  • 网页设计主题内容百度seo排名在线点击器
  • 海东网站建设公司win2008怎么做网站
  • 付公司制作网站费怎么做凭证企业查询app 哪个好用
  • 做网站人员工资wordpress更新后图片不显示
  • 永嘉县住房建设局网站成立公司注册资本什么意思
  • 更改备案网站名称做网站开发需要的笔记本配置
  • 网站开发流程主要分成什么做网站傻瓜软件