B树

B树(B-Tree、B-树)

  • B树是一种平衡的多路搜索树,多用于文件系统、数据库的实现
    示例:

  • B树特点:
    • 一个节点可以存储超过两个元素,可以拥有超过两个子节点
    • 拥有二叉搜索树的一些性质
    • 平衡,每个节点的所有子树高度一致
    • 比较矮的树

M阶B树的性质(M>=2)

假设一个节点存储的元素个数为x

  • 根节点元素个数:1 <= x < M-1
  • 非根节点元素个数:M/2 - 1 <= x <= M-1
  • 如果有子节点,子节点个数y = x+1

B树 VS 二叉搜索树

  • B树和二叉搜索树,在逻辑上是等价的


  • 多代节点合并,可以获得一个超级节点
    • 二代合并的超级节点,最多拥有四个子节点(至少是4阶B树)
    • 三代合并的超级节点,最多拥有八个子节点(至少是8阶B树)
    • n代合并的超级节点,最多拥有2n个子节点(至少是2n阶B树)
  • M阶B树,最多需要log2M代合并

搜索

  1. 先在节点内部从小到大开始搜索元素
  2. 如果命中,搜索结束
  3. 如果未命中,再去对应子节点中搜索元素,重复步骤1

添加

添加元素必定是添加到叶子节点

添加55

添加95

  • 如果此时再插入98(假设这是一颗4阶B树)
    • 最右下角的叶子节点的元素个数将超过限制
    • 这种现象可以称之为:上溢(overflow)

上溢的解决(假设5阶B树)

  • 上溢节点的元素个数必然等于M
  • 假设上溢节点最中间元素的位置为k
    1. 将k位置的元素向上与父节点合并
    2. 将[0,k-1]和[k+1,m-1]位置的元素分裂成两个子节点(这两个子节点的元素个数,必然不会低于最低限制:M/2-1)
  • 一次分裂完毕之后,也可能导致父节点上溢,依然按照上述方法解决
    • 最极端情况可能会一直上溢到根节点

  • 添加导致的上溢实例:

删除

  • 叶子节点
    若需要的删除的元素在叶子节点中,那么直接删除即可

  • 非叶子节点
    若需要的删除的元素在非叶子节点中:1.先找到前驱或后继节点,覆盖所需删除元素的值;2.再把前驱或后继元素删除
    示例:

    注意:非叶子节点的前驱或后继元素,必定在叶子节点中,所以这里的删除前驱或后继元素,就是开始提到的情况:删除的元素在叶子节点中,真正的删除元素都是发生在叶子节点中。

  • 删除-下溢

    叶子节点被删除掉一个元素之后,元素个数可能会低于最低限制(>=m/2 - 1),这种现象被称之为:下溢(underflow)

下溢的解决

情况一:下溢节点的元素个数必然等于m/2 - 2,如果下溢节点临近的兄弟节点,有至少m/2个元素,则可以向兄弟节点借一个元素。
将父节点的元素b插入到下溢节点的0位置(最小位置),用兄弟节点的元素a(最大元素)替代父节点的元素b。这个操作其实就是旋转。(如下图所示)

情况二:如果下溢节点临近的兄弟节点,只有m/2 - 1个元素,则将父节点的元素b挪下来跟左右子节点进行合并,合并之后的节点元素个数等于m/2 + m/2 - 2,不超过m-1。这个操作可能会导致父节点下溢,依然按上述方法解决,下溢现象可能会一直往上传播,直到根节点
(如下图所示)

示例:

此处介绍B树,是为了更好的进入红黑树的学习,因为红黑树的性质和4阶B树类似。

posted @ 2020-05-04 22:32  松鼠航  阅读(175)  评论(0编辑  收藏  举报