B树上溢和下溢

B树(B-树)

B树是一种平衡的多路搜索树,多用于文件系统,数据库的底层实现。

B树的特点

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

image-20210116222831207

N阶B树的性质

B树的阶数指的是树中节点拥有最多的子节点个数。

假设一个节点存储的元素个数是x,这棵树的阶数是m

那么根节点存储元素的个数是:1<=x<=m-1

非根节点:m/2floor -1<=x<=m-1 floor代表m/2向上取整

如果有子节点,子节点的个数y=x+1

根节点:2<=y<=m

image-20210117112435812

当m=2,这时候的B树就是二叉搜索树。

B树和二叉搜索树的关系

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

多带合并可以获得一个超级节点

2代合并的超级节点,做多拥有4个子节点(至少是4阶B树)

3代合并的超级节点,做多拥有8个子节点(至少是8阶B树)

n代合并的超级节点,最多拥有2^n个节点

m阶B树,最多需要log2M代合并

B树的查找

  1. 现在节点内部从小到大开始搜索元素
  2. 如果命中,搜索结束
  3. 重复以上步骤

添加

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

image-20210117113932575

上溢

添加时可能会造成上溢(overflow)

上溢的现象就是例如是一颗4阶B树,当添加完元素后造成右下角叶子结点中的存储元素的数量等于阶数m,这就是上溢。

上溢的解决方案

  • 上溢的节点元素个数必然等于m
  • 假设上溢节点最中间元素的位置是k
  • 将k位置的元素向上与父节点合并
  • 将[0,k-1]和[k+1,m-1]位置的元素分类成2个子节点,这2个子节点的元素个数必然不会低于最低限制。
  • 一次分裂完成后,有可能导致父节点上溢,依然按照上面方法解决。

image-20210117115034427

删除

假设需要删除的元素在非叶子节点中

  1. 先找到前驱或者后继元素,覆盖所需要删除的元素
  2. 再把前驱或者后继元素删除

非叶子节点的前驱或者后继元素必然在叶子结点中,所以删除前驱或者后继吉斯会删除叶子结点中的元素。

image-20210117115650580

下溢

删除操作可能会导致下溢。也就是节点的元素个数小于最小值的限制。

  1. 下溢的节点的元素数量必然等于floor(m/2)-2;
  2. 如果下溢节点临近的兄弟节点,至少有floor(m/2)个元素,可以 向他借一个元素。
  3. 然后将父节点的元素b插入到下溢节点的最小位置
  4. 用兄弟节点的元素a(最大元素)替代父节点的元素b
  5. 这种操作其实也叫做旋转

如果下溢节点临界的兄弟节点,只有floor(m/2)-1个元素,那么将父节点的元素b挪下来跟左右子节点进行合并,合并后的节点元素个数等于floor(m/2)+floor(m/2)-2,不会超过m-1,这个操作可能导致父节点下溢,因此还按照上述方法解决。

image-20210117155605189

image-20210117155848784

上溢到根节点会导致这棵树变高。

下溢到根节点会导致这棵树变低。

猜你喜欢

转载自blog.csdn.net/qq_43672652/article/details/112799072