算法导轮之B树的学习
生活随笔
收集整理的这篇文章主要介绍了
算法导轮之B树的学习
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
最近学习了算法导轮里B树相关的知识,在此写一篇博客作为总结。
1.引言
B树是为磁盘或其他直接存取的辅助存储设备而设计的一种平衡搜索树。B树类似于红黑树,但它与红黑树最大不同之处在于B树的节点可以拥有很多孩子,因此B树的高度会比红黑树小很多,也因此B树在磁盘I/O方面表现要比红黑树好。(对于磁盘操作最耗时的部分在于磁盘读写,而每次读取一个新的树的节点就必须进行一次磁盘读取,因此节点较大、树高度较小的B树会进行较少的磁盘I/O操作)2.B树的定义
一颗B树的定义如下:- n表示存储在该节点的关键字个数
- n个关键字本身key1、key2……keyn以非降序存放,即key1 <= key2 <= …… <= keyn
- 一个leaf布尔值表示该节点是否为叶节点
3.B树的插入
要讲到树,就不得不提树中关键的插入与删除操作,这里我们先总结B树的插入操作。 当我们往B树中插入一个新的关键字时,由于B树节点的关键字是受到限制的,因此当一个节点关键字数目为2t-1时(该节点是满的),我们就必须进行分裂操作。分裂节点
分裂节点的主要操作为把满节点的中间关键字提升至父节点,把原满节点分裂为中间关键字的两个左右节点 其示意图如下: 对于某个非满的节点x,若其孩子节点x.ci为满的(即孩子节点的关键字数目为2t-1)。则把其孩子节点的中间关键字(S)提升为父节点(x节点)的关键字,并把原孩子节点(x.c节点)分成两个t-1个关键字的节点,分别位于中间关键字(S)的左、右。 还有一种比较特殊的情况就是B树根的分裂: 分裂是B树长高的唯一途径,因此分裂是非常重要的。插入
讲完分裂操作在讲插入操作就非常简单了。插入的时候我们通过比较不断地根据关键字的值寻找孩子节点,当发现一个满的节点时便分裂,最后找到对应的叶节点时根据关键字的值插入相应位置即可。 下面是一个插入关键字的例子: B树的初始状态如图所示,这是一颗最小度数为3的B树,即他的关键字个数为2~5个。 插入关键字B,在根节点由于(B < G)往进入G的左节点,到达叶节点后添加至A与C关键字之间。 插入关键字Q:4.B树的删除
讲完了B树的插入操作,我们再来讲讲B树的删除操作。 对于删除操作,我们必须保证每个节点在删除前必须至少有t(最小度数)个关键字。 首先我们把要删除的关键字(假设为k)分两种情况:- 关键字k在叶节点中:直接删除
- 关键字k在内部节点中,分三种情况:
- k的左子节点拥有t个关键字,则把k的左子节点的最后一个关键字(假设为j)上移到父节点,然后递归的删除j
- k的右子节点拥有t个关键字,则把k的右子节点的第一个关键字(假设为l)上移到父节点,然后递归的删除l
- k的左右子节点都只有t-1个关键字,则把k下降与左右子节点合并成一个拥有2t-1个关键字的节点,然后递归的删除k
转载于:https://www.cnblogs.com/KingIceMou/p/6984141.html
总结
以上是生活随笔为你收集整理的算法导轮之B树的学习的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 关于面试,我也有说的
- 下一篇: JAVA多线程--Thinking in