B树(多路平衡查找树)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了B树(多路平衡查找树)相关的知识,希望对你有一定的参考价值。

参考技术A

①二叉排序树的结点值满足:左子树<根<右子树,当中序遍历时,可得到有序序列,如下图

②5叉排序树如下图

观察到,5叉树中每个节点的分支最多可有5个,每个结点的关键字最多可有4个(有序),最后一层为查找失败的情况

如要查找9,首先和根结点22比较,发现比22小,到左子树中查找;依次和5 ,11比较,找到第一个大于9的关键字,到其左指针指向的子树中查找;依次和6,8,9比较,最终查找到9

如果每个结点中只包含一个关键字,则5叉排序树就退化为了二叉排序树,在关键字的数量相同时,树会变高。而由查找的过程可知,树越高,查找效率越低。

为保证m叉排序树的查找效率,因此这里给出一个策略,即让结点数包含的关键字尽可能多,从而降低树的高度

加此约束后,其实树依然有很高的情况,如下图

原因很显然,就是不平衡

现追加约束,即在满足每个结点的分支数为m/2向上取整的同时,也满足绝对平衡(左右子树高度相同),称这样的树为B树(可为空)

思路:

高度最大时,即要满足每个结点分支最少(关键字最少),根据约束可知为m/2向上取整(设为k),即第一层1个结点,第二层2个结点,第三层2 k个结点,第h层2 k (h-2),第h+1层2*k (h-1)。事实上,第h+1层为失败结点,n个关键字的失败结点有n+1个(n个关键字把(-∞,+∞)拆分为n+1个区间,就对应n+1个失败情况),所以n+1>=2*k^(h-1),得h<=log(k)[(n+1)/2] + 1

高度最小时,即要满足每个结点分支最多(关键字最多),为m,h层总结点数为k=(1+m+m 2+……+m (h-1)),则关键字总数为m k,应满足m k >= n,得到h>=log(m)(n+1)

插入
①一定是插入到最下面一层
②结点容量不够时,以中间为准拆分,提中间关键字到父结点(位置为指针右边)

删除
①对终端结点的删除
满足关键数约束(5阶时,即要求至少有2个关键字)时,直接删除

删除后不满足约束时,先看左右兄弟是否够借,以右兄弟够借为例,分别用后继,后继的后继填补
如删除38(49代替38,70代替49)

不够借时,将该结点,其兄弟结点,两结点中间的关键字,三者合并。如删除49

②对非终端结点的删除:使用前驱(左子树最右下)或后继(右子树最左下)代替
如删除根结点80

另外,也可以用82代替

以上是关于B树(多路平衡查找树)的主要内容,如果未能解决你的问题,请参考以下文章

数据结构查找---多路查找树(2-3树)

数据结构(三十九)多路查找树(B树)

MySQL索引学习

MySQL索引学习

B+树

MySQL架构