目录
B树和B+树
B树
含n个关键字的m叉B树
m阶B树的核心特性
- 👩💻 (尽可能“满”)根节点的子树∈[2,m],关键字数∈[1,m-1]。其他结点的子树数∈[⌈m/2⌉,m];关键字∈[⌈m/2⌉-1,m-1]
- 👩💻(尽可能“平衡”)对任一结点,其所有子树高度都相同
- 关键字的值:子树0<关键字1<子树1<关键字2<子树2<……(类比二叉查找树 左<中<右)
B树的插入
- 通过“查找”确定插入位置(一定是在终端结点)
- 若插入后结点关键字个数未超过上限,则无需做其他处理
- 若插入后关键字个数超过上限,则需要将当前结点的中间元素放到父节点中,当前节点分裂为两个部分:该操作会导致父节点关键字个数+!,若父节点关键字个数也超过了上限,则需要再向上分裂;根节点的分裂会导致B树高度+1
B树的删除
非终端结点关键字
- 用其直接前驱或直接后继替代其位置,转化为对”终端结点“的删除
- 直接前驱:当前关键字左边指针所指子树中”最右下“的元素
- 直接后继:当前关键字右边指针所指子树中”最坐下“的元素
终端结点关键字
删除后结点关键字个数未低于下限,无需任何处理
低于下限
- 右兄弟够借,则用当前结点的后继、后继的后继依次顶替空缺
- 左兄弟够借,则用当前结点的前驱,前驱的前驱依次顶替空缺
- 左(右)兄弟不够借,则需要与父节点内的关键字、左(右)兄弟进行合并。合并后导致父节点关键字数量-1,可能需要继续合并。
B+树
m阶B树 | m阶B+树 | |
---|---|---|
类比 | 二叉查找树的进化 → m叉查找树 | 分块查找的进化 → 多级分块查找 |
关键字与分叉 | n个关键字对应n+1个分叉(子树) | n个关键字对应n个分叉 |
结点包含的信息 |