B树、B+树、B-树

    最近在学习数据库中的索引时,遇到了数据结构中的B+树和B-树,以及相关的操作,所以参考了一些资料整理了下面的知识点。

1. B树

    B树也就是最基本的二叉搜索树,只不过换了个名字而已。每个非叶子节点最多只能存放两个孩子,其中节点的左孩子一定比该节点小,右孩子一定比该节点大,搜索节点在时间效率上是与二分查找是等价的(根节点左右孩子总数目差不多的情况下)。它与二分查找的优点是,在进行增删操作时,不需要移动大段的内存数据,通常是常数开销。


2. B-树

性质:是一种多路搜索树(非二叉结构):

1.任意非叶子节点最多有M个孩子,且M>2;

2.根节点孩子数为[2,M]个;

        3.除根节点外的非叶子结点孩子树没[M/2, M];

4.每个节点存放至少M/2-1(取上整)和至多M-1个关键字,至少两个关键字;

5.非叶子结点关键字数 = 指向孩子们的指针数 – 1

6.左右叶子节点位于同一层

  7.每个非叶子结点的指针下孩子们的取值范围在该节点的数值范围区间内(后面详细阐述)

如图为一个B-树:

《B树、B+树、B-树》

下面简单解释一下第7条是怎么回事,其实有点像二叉树的形式,我们看第二层第一个节点,P1指针下的孩子们的数值范围在<8,P2孩子们的数值范围在(8,12),P3孩子们在(12,26)

搜索有可能在非叶子结点结束,并且性能等价于二分查找,不同于B树的根节点是否平衡的情况


3. B+树

B+树与B-树大体相同,除了:

1.非叶子结点的子树指针树和关键字个数相同;

2.非叶子结点孩子范围是[ )区间;

3.为所有叶子节点增加链指针;

4.所有关键字都在叶子节点出现;

5.搜索只有在叶子节点才能结束,不能在非叶子节点结束。

如图所示:

《B树、B+树、B-树》

其特性是更加适合文件索引系统。

4. 对B树的增加、删除操作

既然是树,那么必不可少的操作就是插入和删除,这也是B树和其它数据结构不同的地方,当然了,还有必不可少的搜索,分享一个对B树的操作进行可视化的网址,它是由usfca提供的。

假定对高度为h的m阶B树进行操作。

插入

新结点一般插在第h层,通过搜索找到对应的结点进行插入,那么根据即将插入的结点的数量又分为下面几种情况。

  • 如果该结点的关键字个数没有到达m-1个,那么直接插入即可;
  • 如果该结点的关键字个数已经到达了m-1个,那么根据B树的性质显然无法满足,需要将其进行分裂。分裂的规则是该结点分成两半,将中间的关键字进行提升,加入到父亲结点中,但是这又可能存在父亲结点也满员的情况,则不得不向上进行回溯,甚至是要对根结点进行分裂,那么整棵树都加了一层。

其过程如下:

《B树、B+树、B-树》

《B树、B+树、B-树》

《B树、B+树、B-树》

《B树、B+树、B-树》

删除


同样的,我们需要先通过搜索找到相应的值,存在则进行删除,需要考虑删除以后的情况,

  • 如果该结点拥有关键字数量仍然满足B树性质,则不做任何处理;
  • 如果该结点在删除关键字以后不满足B树的性质(关键字没有到达ceil(m/2)-1的数量),则需要向兄弟结点借关键字,这有分为兄弟结点的关键字数量是否足够的情况。
    • 如果兄弟结点的关键字足够借给该结点,则过程为将父亲结点的关键字下移,兄弟结点的关键字上移;
    • 如果兄弟结点的关键字在借出去以后也无法满足情况,即之前兄弟结点的关键字的数量为ceil(m/2)-1,借的一方的关键字数量为ceil(m/2)-2的情况,那么我们可以将该结点合并到兄弟结点中,合并之后的子结点数量少了一个,则需要将父亲结点的关键字下放,如果父亲结点不满足性质,则向上回溯;
  • 其余情况参照BST中的删除。

其过程如下:

《B树、B+树、B-树》

《B树、B+树、B-树》

《B树、B+树、B-树》

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