经典查找算法 --- B-树

B-

          是一种多路搜索树(并不是二叉的):

     其中所有孩子节点个数的最大值称为B-树的阶,通常用M表示。从查找效率来说M>=3。一颗M阶的B-树或者是一颗空树,或者是满足一下要求的m叉树。

    1)每个节点最多有m个分支(子树);而最少分支棵树要看是否为根节点,根节点至少有2个分支,非根节点至少有[m/2](向上取整)个分支。

    2) 有n个分支的节点有n-1个关键字,它们按照递增顺序排序。k=2(根节点)或者[m/2](非根节点)

    3)每个节点的存储结构

                              《经典查找算法 --- B-树》

                              其中,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-树》      


    B-树的基本操作

1,B-树的查找

B-树很简单,是二叉排序树的扩展,二叉排序树是二路查找,B-树是多路查找,因为B-树内关键字是有序的,在节点内进行查找的时候除了顺序查找之外,还可以用这半查找来提高效率。

                           例如,需要查找关键字42。首先在根节点查找,因为42>30,则沿着根节点p[1]往下走;在子树根中查找,因为39<42<45,则沿着子树根节点中指针p[1]往下走,在下层节点中查找关键字42成功,查找结束。

                            如果下面的图片看不见请点击这里  

《经典查找算法 --- B-树》


2,B-树的插入和删除

        与二叉树的插入一样,B-树进行创建过程也是将关键字逐个插入到树中的过程。

在进行插入或者删除之前,需要确定一下每个结点中关键字的个数范围,如果B-树的阶树为m,则结点中关键字个数范围[m/2]-1 ~ m-1; 比如 是5阶的B-树,则需要 除了根节点外,其他结点个数 范围是 2 ~ 4个, 如果少于或者多余则需要进行拆分和组合。
                下面的是借鉴别人的博客进行的。
               

 B树的生成也是从空树起,逐个插入关键字而得。但由于B树结点中的关键字个数必须≥ceil(m/2)-1,因此,每次插入一个关键字不是在树中添加一个叶子结点,而是首先在最低层的某个非终端结点中添加一个关键字,若该结点的关键字个数不超过m-1,则插入完成,否则要产生结点的“分裂”,

如图(a) 为3阶的B树(图中略去F结点(即叶子结点)),假设需依次插入关键字30,26,85。

《经典查找算法 --- B-树》

1) 首先通过查找确定插入的位置。由根*a 起进行查找,确定30应插入的在*d 节点中。由于*d 中关键字数目不超过2(即m-1),故第一个关键字插入完成:如(b)

《经典查找算法 --- B-树》

2) 同样,通过查找确定关键字26亦应插入 *d. 由于*d节点关键字数目超过2,此时需要将 *d分裂成两个节点,关键字26及其前、后两个指针仍保留在 *d 节点中,而关键字37 及其前、后两个指针存储到新的产生的节点 *d` 中。同时将关键字30 和指示节点 *d `的指针插入到其双亲的节点中。由于 *b节点中的关键字数目没有超过2,则插入完成.如(c)(d)

《经典查找算法 --- B-树》《经典查找算法 --- B-树》

3) (e) -(g) 为插入85后;

《经典查找算法 --- B-树》《经典查找算法 --- B-树》《经典查找算法 --- B-树》

                         
 B-树的删除

      反之,若在B树上删除一个关键字,则首先应找到该关键字所在结点,并从中删除之,若该结点为最下层的非终端结点,且其中的关键字数目不少于ceil(m/2),则删除完成,否则要进行“合并”结点的操作。假若所删关键字为非终端结点中的Ki,则可以指针Ai所指子树中的最小关键字Y替代Ki,然后在相应的结点中删去Y。例如,在下图  图4.1( a)的B树上删去45,可以*f结点中的50替代45,然后在*f结点中删去50。

《经典查找算法 --- B-树》

                                图4.1( a)

因此,下面我们可以只需讨论删除最下层非终端结点中的关键字的情形。有下列三种可能:

    (1)被删关键字所在结点中的关键字数目不小于ceil(m/2),则只需从该结点中删去该关键字Ki和相应指针Ai,树的其它部分不变,例如,从图  图4.1( a)所示B树中删去关键字12,删除后的B树如图  图4.2( a)所示:

《经典查找算法 --- B-树》

                           图4.2( a)

   (2)被删关键字所在结点中的关键字数目等于ceil(m/2)-1,而与该结点相邻的右兄弟(或左兄弟)结点中的关键字数目大于ceil(m/2)-1,则需将其兄弟结点中的最小(或最大)的关键字上移至双亲结点中,而将双亲结点中小于(或大于)且紧靠该上移关键字的关键字下移至被删关键字所在结点中。

[例如],从图图4.2( a)中删去50,需将其右兄弟结点中的61上移至*e结点中,而将*e结点中的53移至*f,从而使*f和*g中关键字数目均不小于ceil(m-1)-1,而双亲结点中的关键字数目不变,如图图4.2(b)所示。

《经典查找算法 --- B-树》

                               图4.2(b)

       (3)被删关键字所在结点和其相邻的兄弟结点中的关键字数目均等于ceil(m/2)-1。假设该结点有右兄弟,且其右兄弟结点地址由双亲结点中的指针Ai所指,则在删去关键字之后,它所在结点中剩余的关键字和指针,加上双亲结点中的关键字Ki一起,合并到 Ai所指兄弟结点中(若没有右兄弟,则合并至左兄弟结点中)。

[例如],从图4.2(b)所示 B树中删去53,则应删去*f结点,并将*f中的剩余信息(指针“空”)和双亲*e结点中的 61一起合并到右兄弟结点*g中。删除后的树如图4.2(c)所示。

 《经典查找算法 --- B-树》

                                图4.2(c)

 如果因此使双亲结点中的关键字数目小于ceil(m/2)-1,则依次类推。

[例如],在 图4.2(c)的B-树中删去关键字37之后,双亲b结点中剩余信息(“指针c”)应和其双亲*a结点中关键字45一起合并至右兄弟结点*e中,删除后的B树如图 4.2(d)所示。  
《经典查找算法 --- B-树》

B-树主要应用在文件系统

为了将大型数据库文件存储在硬盘上以减少访问硬盘次数为目的 在此提出了一种平衡多路查找树——B-树结构 由其性能分析可知它的检索效率是相当高的为了提高 B-树性能’还有很多种B-树的变型,力图对B-树进行改进

    原文作者:查找算法
    原文地址: https://blog.csdn.net/sjyttkl/article/details/70197537
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞