我是靠谱客的博主 追寻裙子,最近开发中收集的这篇文章主要介绍B 树的删除操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


对于B树的删除操作研究了好些时日,感谢这篇文章让我对这个过程清晰起来.


对于B树的删除可能会破坏掉B树的充要条件,因此有必要回顾以下B树的定义(算法导论):
一棵B树是具有如下性质的有根树.

  • 每个节点具有以下域:
    • n[x]:当前存储中关键字的个数
    • n[x]个关键字本身:以非降序存放,因此 key1[x]key2[x]...keyn[x] .
    • leaf[x],是个bool值,如果是叶子节点的话是true.否则为false
  • 每个内节点x(不是叶节点)还包含n[x]+1个指向其子女的指针 c1[x],c2[x],...,cn[x]+1[x] .n[x]个关键字将各个子树中所有的关键字分割开来.
  • 每一个节点所能包含的关键字个数有一个上界和一个下界.这些可以用称作B树的最小读书被固定整数t>=2来表示.
    +每个非根节点必须至少有t-1个关键字,每个非根内节点至少有t个子女.如果树是非空的,则根节点至少包含一个关键字.
    +每个节点至多包含(2t-1)个关键字,所以内节点至多有2t个子女,一个节点是满的说明它有2t-1个关键字.

定义有些罗嗦,可以总结下,当树非空的时候,每个节点记录关键字个数n[x]和n[x]个关键字本身;还记录着n[x]+1个孩子节点的指针,这些指针域插空在各个关键字的间隔当中,以孩子节点为根的子树上所有关键字最小不小于指针所指空左边关键字,最大不大于右边的.;还有一个bool的标志,记录当前节点是否为叶节点.;对节点中关键字个数也有要求,假设一个最小度t,非空树根节点至少包含于各关键字,叶节点没有孩子,叶子节点和非根内节点关键字个数最少不低于t-1歌,最多不大于2t-1.

B 树的插入删除操作主要目的是插入删除元素后仍旧是一棵B树. 删除要保证每个节点关键字个数的下界t-1和上界2t-1.
如果要删除某一个元素,首先要沿着某条路径找到这个元素删除.于是我们需要B_delete(x,k),x是我们当前面临的节点.如果B树只有一层的话,我们毫无顾虑,类似数组删除一个元素一样.如果有多层,删除的操作都是在叶节点上进行的, 算法导论中的方法保证了当前处理的节点x至少含有t个关键字,以防止节点关键字下降至子树的时候不再满足B树的充要条件
算法执行过程要面对两种种节点给出处理方式,叶子节点, 内节点. 面对节点有两种情况: k在x内 和 k不在x内.
特别要指出的是,当根节点中不再含有节点时候(合并节点时候x唯一的一个节点下降到子节点中了,后边会说到).删除根节点让新合成的节点作为B树的新根.我们来讨论这个删除过程. 这是一个递归的过程.

如果x是叶子节点且k在x中,直接删除k.
如果x是内节点且k在节点x当中.按照以下的情况处理:
a) 如果前于x的节点的子树中的节点数目大于等于t,可以沿着这个子树找到它的前驱k',删除这个前驱节点,并用这个前驱节点替代k.
b) 如果后于x的节点的子树中的节点树目大于等于t,可以沿着这个子树找到他的后继k',删除这个后继节点,并用这个后继节点替代k.
c) 如果以上两种情况中的两棵子树书目都等于t-1,合并这两棵子树并把下降关键字k至新的节点,释放合并前的右子树,继续在子树递归的删除k.
如果x是内节点且k不在x中,按照以下情况处理,则必定在x的某一棵子树 ci(x) 中,如果ci(x)中关键字的个数是t-1,执行a)或b)的过程保证该子树中根节点关键字个数位t,然后在x某个合适的子树中删除k.
a) 如果ci(x)的相邻的兄弟孩子中至少有一个关键字个数大于等于t,就从x节点下降一个节点到ci(x),然后从兄弟节点上升一个节点到x.(引渡)
b) 如果ci(x)所有兄弟节点关键字个数都等于t-1,那么就与其中一个兄弟节点合并.并将x的一个关键字下移到新合并的节点中成为中间的节点.

整个过程需要O(h)次磁盘存取操作,O(th)的CPU时间. h=logt(n). n是关键字的总数

参考:
1)算法导论
2)https://my.oschina.net/eillenme/blog/117608

最后

以上就是追寻裙子为你收集整理的B 树的删除操作的全部内容,希望文章能够帮你解决B 树的删除操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部