B-树的操作总结

来源:互联网 发布:javascript 执行顺序 编辑:程序博客网 时间:2024/06/07 01:16

B-树的操作总结

@(算法学习)

写在前面,关于B-树的操作,需要铭记的是一个神奇的数字m/21,这是非根结点的最小关键字数。最大自然是m-1不用多说。

插入,删除都将以这个数字为基准进行。所以看到B-树的操作,想一想,哦,有一个数字需要马上闪现。然后才能正确解题。普通的问关键字最少多少,深度最少多少,这个数字也扮演着难以估量的角色。甚至不用推导其他什么公式,直接根据关键字数的范围,就可解决问题。

比如:

http://blog.csdn.net/u011240016/article/details/53149389?locationNum=1&fps=1

B-树的查找

两个基本操作:

  • 在B-树中找结点(粗粒度的寻找,快速,跨越式定位)
  • 在结点中找关键字

B-树结构通常存在磁盘上,因此第一个基本操作发生在磁盘上,,所以不宜进行次数过多。找到结点后,会把结点调入内存,在内存中进行关键字的查找。

B-树的插入

主要把握插多了如何炸裂的问题。

过程通常是先找到插入位置再看插入后是否炸裂。不是先检查是否可能超过范围,避免后来的分裂。

  • 查找。插入的关键字一定是插入到最底层的非叶结点中。也就是最底层的含有关键字的结点里。B-树下面还有一些纯属打酱油用的没有关键字的号称叶子结点的虚拟结点。
  • 插入。B-树中的结点关键字都在[m/21,m1]之间。而判定是否可插入的条件是:插入后关键字个数小于m就可以让其插入。然后最大的情况是插入后关键字数变为m,就需要炸裂。这是条件设定导致的隐患。

还不是很清楚为什么要这么设计,分裂是可以被避免的。

分裂:取来一个新的结点,将m/2位置处(即中间,奇数的话正好是中间,偶数偏左一些)的关键字,放到父亲结点。左边的放在原结点,右边的放在新结点。
注意下标是从1开始计数。
如果父亲结点个数也超过了,则同样的策略向上走。直到根,根的关键字个数要求是[1,m1]个关键字,如果根也要炸,那就可以长个子了!

B-树的删除

删除真是奇怪的设计。

删除不必考虑上限,而是删除后结点的关键字个数别小于m/21了。

小于则结点不能自立,需要抱团取暖 – 合并。
两个大的分类:

  • 删除的关键字在非终端节点。
  • 删除的关键字在最底层非叶结点,即终端结点(含关键字)。

关键字设为k。
核心思路是:自私。非终端结点为了维护自己的结构不乱,拿左右孩子顶枪子。

第一类: 删除的关键字在非终端节点

1)小于k的左子树关键字个数大于m/21,那么就意味着删除左子树的一个元素可行。找出k的前驱值k’,在左子树中。然后用这个值取代k,k就算作被删除了,但是此非终端结点结构还是完整的。左子树的k’关键字就不能留了,否则重复了。于是递归删除k’。递归是指,同样对待自己的左右孩子。。。层层传递。上梁不正下梁歪。。。你欺负我,我欺负别人。。
2)如果左子树不满足,就欺负右子树。如果右子树关键字个数大于m/21,那么找到k的后继k’,取代k,再递归删除k’.

注意到吗,这个递归,将是从左到右。所以子问题是原来问题的完整对映。

3)左右都不满足,即左右子树关键字个数都恰好为m/21,那就挥刀自宫,直接删除k, 然后把左右子树合在一起。都这么小,存在一起好了。

第二类:删除的关键字在最底层非叶结点,即终端结点(含关键字)。

1)被删除关键字所在结点关键字个数大于m/21,删除后仍然满足B-树定义,删除即可。

2)兄弟够借。如果被删除关键字所在的结点关键字个数是最少的m/21,删除肯定会不满足B-树定义。于是想从兄弟那借,左兄弟够借,那么左兄弟最大的关键字给父结点,父结点把删除关键字所在结点的前驱值给它。这样借的其实并不是真的左兄弟的。
左兄弟不够,右兄弟够,也是这种父子移位法。父亲把删除关键字结点的后驱拿给它,然后右兄弟把最小的拿到父亲结点。

3)兄弟都很穷。父亲接济一个然后与兄弟合并。

一检查到大家都很小,那就紧凑一下,合并过日子。

1 0
原创粉丝点击