经典查找算法 --- B-树
来源:互联网 发布:java语法分析器 编辑:程序博客网 时间:2024/06/05 21:15
B-树
是一种多路搜索树(并不是二叉的):
其中所有孩子节点个数的最大值称为B-树的阶,通常用M表示。从查找效率来说M>=3。一颗M阶的B-树或者是一颗空树,或者是满足一下要求的m叉树。
1)每个节点最多有m个分支(子树);而最少分支棵树要看是否为根节点,根节点至少有2个分支,非根节点至少有[m/2](向上取整)个分支。
2) 有n个分支的节点有n-1个关键字,它们按照递增顺序排序。k=2(根节点)或者[m/2](非根节点)
3)每个节点的存储结构
其中,n,为关键字的个数,ki(1<=k<=n)为该节点的关键字且满足ki<ki+1;pi(0<=i<=n)为该节点的孩子节点指针且满足pi(1<=i<=n-1)所指节点上的关键字ki且小于ki+1,p0所指结点上的关键字小于k1,pn所指节点上的关键字大于kn.
4)节点内各个关键字互不相等且按照从小到大排序。
5)各个底层是叶子节点,它们处于同一层;叶子节点下面是失败节点(可以是空指针表示),是查找失败到达的位置。
扩展:平衡m叉查找树是指每个关键字的左侧子树与右侧子树高度差的绝对值不能超过 1 的查找树,其节点结构与上面提到的B-树结构相同。由此可见B-树是平衡m叉查找树,但是限制更强,要求所有叶子节点都要在同一层。
如下图所示:
1,节点的分支数关键字增加1,最大分支数就是B-树的阶树,因此m阶的B-树中节点最多有m个分支。通过下图可以看出,图中是一个5阶B-树(这里的阶就是树的度)。
2,下面是一颗5阶B-树,因此[m/5]=[m/2]=3,可以看出图中除了根节点外,所有节点最少有三个分支。
3,如果根节点没有关键字就没有分支,此时B-树就是一个空树,如果根结点有关键字,则其分支必大于或等于2,因为分支数等于关键字+1。
4,右下图可以知晓:除根节点外,节点中的关键字的个数至少为2,因为分支数至少为3,分支数比关键字数多1;还可以看出节点内关键字都是有序的,并且在同一层上,左边节点内所有关键字均小于右边节点内所有关键字。
5,B-树一个关键的特性是:下层节点内的关键字取值总是落在上层节点关键字所划分的区间内,具体落在哪个区间,可以由它们的指针看出。
B-树的基本操作
1,B-树的查找
B-树很简单,是二叉排序树的扩展,二叉排序树是二路查找,B-树是多路查找,因为B-树内关键字是有序的,在节点内进行查找的时候除了顺序查找之外,还可以用这半查找来提高效率。
例如,需要查找关键字42。首先在根节点查找,因为42>30,则沿着根节点p[1]往下走;在子树根中查找,因为39<42<45,则沿着子树根节点中指针p[1]往下走,在下层节点中查找关键字42成功,查找结束。
如果下面的图片看不见请点击这里
2,B-树的插入和删除
B-树的生成也是从空树起,逐个插入关键字而得。但由于B-树结点中的关键字个数必须≥ceil(m/2)-1,因此,每次插入一个关键字不是在树中添加一个叶子结点,而是首先在最低层的某个非终端结点中添加一个关键字,若该结点的关键字个数不超过m-1,则插入完成,否则要产生结点的“分裂”,
如图(a) 为3阶的B-树(图中略去F结点(即叶子结点)),假设需依次插入关键字30,26,85。
1) 首先通过查找确定插入的位置。由根*a 起进行查找,确定30应插入的在*d 节点中。由于*d 中关键字数目不超过2(即m-1),故第一个关键字插入完成:如(b)
2) 同样,通过查找确定关键字26亦应插入 *d. 由于*d节点关键字数目超过2,此时需要将 *d分裂成两个节点,关键字26及其前、后两个指针仍保留在 *d 节点中,而关键字37 及其前、后两个指针存储到新的产生的节点 *d` 中。同时将关键字30 和指示节点 *d `的指针插入到其双亲的节点中。由于 *b节点中的关键字数目没有超过2,则插入完成.如(c)(d)
3) (e) -(g) 为插入85后;
因此,下面我们可以只需讨论删除最下层非终端结点中的关键字的情形。有下列三种可能:
[例如],从图图4.2( a)中删去50,需将其右兄弟结点中的61上移至*e结点中,而将*e结点中的53移至*f,从而使*f和*g中关键字数目均不小于ceil(m-1)-1,而双亲结点中的关键字数目不变,如图图4.2(b)所示。
[例如],从图4.2(b)所示 B-树中删去53,则应删去*f结点,并将*f中的剩余信息(指针“空”)和双亲*e结点中的 61一起合并到右兄弟结点*g中。删除后的树如图4.2(c)所示。
[例如],在
B-树主要应用在文件系统
为了将大型数据库文件存储在硬盘上以减少访问硬盘次数为目的 在此提出了一种平衡多路查找树——B-树结构 由其性能分析可知它的检索效率是相当高的为了提高
- 经典查找算法 --- B-树
- 经典查找算法 --- B+树
- 经典查找算法 --- B*树
- B- 树查找算法分析
- 经典查找算法 -AVL树
- 经典查找算法 --- R树
- 经典算法和数据结构(四) 平衡查找树之B树
- 查找中的算法----HASH查找,二分查找,堆查找,B树查找,字典树,海量查找
- 【经典算法】二分查找
- 经典算法之查找
- 【经典算法】:二分查找
- 经典查找算法
- 经典查找算法
- 经典查找算法
- 经典查找算法
- 【经典算法探究】:B树,B+树,B-树,B*树
- 数据结构与算法7:哈夫曼树,二叉查找树,平衡二叉查找树,B树,B+树
- 查找、检索 算法-总结5 多路查找树/B~树/B+树
- Matlab Online 体验
- git push错误failed to push some refs to的解决
- 谁获得了最高奖学金[结构体数组]
- java学习中遇到的Scanner死循环问题
- ArrayList类的实现
- 经典查找算法 --- B-树
- 贪心——HDU 4572
- innodb undo --update undo log补充2
- MPU6050姿态结算(采用硬件I2C实现数据融合算法)
- Eddy的难题
- SpringBoot开发详解(三)--SpringBoot配置文件YML注意事项
- 判断java源文件名称
- java面向对象思想编程
- 在oc中如何利用反射机制