B树&B+树
B树
Def.
Branches/Balance?,多路平衡查找树
二叉查找树 → m叉查找树
如何保证查找效率?
- 限制最小分叉数(除开根结点)
- 限制任何一个结点的子树高度都要相同
如果m叉查找树满足以上两点限制,它就是一棵B树:
正如其名,着重关注两点特性:多路(m叉,注意上下限),平衡(子树高度一致)
核心特性归纳
B树的高度
最小高度
注意结点与关键字的区别!
- 一个结点最多可以放 m-1 个关键字
- 根结点有且仅有一个(视作第0层),依次向下第1层最多有 m 个结点,第二层 m^2 , ... ,以此类推可得上图不等式
最大高度
- 从叶子节点个数入手
- 或者从关键字的个数入手:
求出的最大高度结果一致
小结
B树的插入和删除
插入
插入位置一定是最低层的非叶节点(叶子结点就是失败结点)
否则会出现下图的错误情况:(将90插到了上层结点中 → 破坏B树特性)
对于m阶B树,当插入后的关键字个数大于m-1时,需要对结点进行分裂:
分裂后的结构如下:
注意到分裂操作会使父结点容纳的关键字加一,因此可能会导致父结点也“装满”了,这时就需要继续对父结点进行
分裂...
总结:B树的插入分为两步:①定位 ②插入
删除
-
对终端结点可以直接删除(注意维持结点内对关键字个数的限制)
-
对非终端结点的删除操作必然可以转化为对终端结点的删除操作(找直接前驱和直接后继):
现在讨论删除后结点内关键字不够(低于下限)的情况:
“删除38”
删除之后25所在结点不满足B树性质(2≤n≤4),因此需要向旁边的兄弟借:
“删除90”
“继续删除49”
可是它的兄弟也不富裕了,这时就需要进行合并操作:
问题还没有结束,合并操作使得父结点的关键字又少了一个,导致父结点的关键字个数不够,因此需要继续合并:
最后的B树结构如下:
核心要求其实就两点:
- 结点内对关键字个数的限制
- 子树0<关键字1<子树1<关键字2 ...
B+树
B+树结合了B树和分块查找的思想:
Def.
下面给出B+树的定义:
B+树的查找
- **Attempt_1: 从根开始的多路查找: **
**Attempt_2: 也可以从指针p开始,即从最小关键字开始的顺序查找: **