B树(B-树)
B树是一种平衡的多路搜索树,多用于文件系统,数据库的底层实现。
B树的特点
- 1个节点可以存储超过两个元素,可以拥有超过2个子节点
- 拥有二叉搜索树的性质
- 平衡,每个节点的所有子树高度一致。
- 比较矮
N阶B树的性质
B树的阶数指的是树中节点拥有最多的子节点个数。
假设一个节点存储的元素个数是x,这棵树的阶数是m
那么根节点存储元素的个数是:1<=x<=m-1
非根节点:m/2floor -1<=x<=m-1 floor代表m/2向上取整
如果有子节点,子节点的个数y=x+1
根节点:2<=y<=m
当m=2,这时候的B树就是二叉搜索树。
扫描二维码关注公众号,回复:
13438079 查看本文章
B树和二叉搜索树的关系
B树和二叉搜索树在逻辑上是等价的。
多带合并可以获得一个超级节点
2代合并的超级节点,做多拥有4个子节点(至少是4阶B树)
3代合并的超级节点,做多拥有8个子节点(至少是8阶B树)
n代合并的超级节点,最多拥有2^n个节点
m阶B树,最多需要log2M代合并
B树的查找
- 现在节点内部从小到大开始搜索元素
- 如果命中,搜索结束
- 重复以上步骤
添加
添加元素必定是添加到叶子结点
上溢
添加时可能会造成上溢(overflow)
上溢的现象就是例如是一颗4阶B树,当添加完元素后造成右下角叶子结点中的存储元素的数量等于阶数m,这就是上溢。
上溢的解决方案
- 上溢的节点元素个数必然等于m
- 假设上溢节点最中间元素的位置是k
- 将k位置的元素向上与父节点合并
- 将[0,k-1]和[k+1,m-1]位置的元素分类成2个子节点,这2个子节点的元素个数必然不会低于最低限制。
- 一次分裂完成后,有可能导致父节点上溢,依然按照上面方法解决。
删除
假设需要删除的元素在非叶子节点中
- 先找到前驱或者后继元素,覆盖所需要删除的元素
- 再把前驱或者后继元素删除
非叶子节点的前驱或者后继元素必然在叶子结点中,所以删除前驱或者后继吉斯会删除叶子结点中的元素。
下溢
删除操作可能会导致下溢。也就是节点的元素个数小于最小值的限制。
- 下溢的节点的元素数量必然等于floor(m/2)-2;
- 如果下溢节点临近的兄弟节点,至少有floor(m/2)个元素,可以 向他借一个元素。
- 然后将父节点的元素b插入到下溢节点的最小位置
- 用兄弟节点的元素a(最大元素)替代父节点的元素b
- 这种操作其实也叫做旋转
如果下溢节点临界的兄弟节点,只有floor(m/2)-1个元素,那么将父节点的元素b挪下来跟左右子节点进行合并,合并后的节点元素个数等于floor(m/2)+floor(m/2)-2,不会超过m-1,这个操作可能导致父节点下溢,因此还按照上述方法解决。
上溢到根节点会导致这棵树变高。
下溢到根节点会导致这棵树变低。