说明:本文参考了启航25版本、竟成25版本、王道25版本、考研官方推荐教材、互联网资料以及结合个人的理解整理。本人水平有限,若有不对之处,烦请指正。
一 真题2009-8
-
下列叙述中,不符合m 阶B树定义要求的是()。
A. 根结点最多有m棵子树
B.所有叶结点都在同一层上
C.各结点内关键字均升序或降序排列
D.叶结点之间通过指针链接
二 读题
本题根据m阶B树特征分析
三 哔哔详解
A\B\C 均为B 树基本特征; D 选项是B+树特征,故选D;
四 参考答案
参考答案 D;
五 考点精析
5.1 B 树的定义与性质
5.1.1 B树定义
B树(B-tree)是一种平衡的多路搜索树,主要用于磁盘等外存数据管理。一棵 m阶 B树(m≥3)满足以下条件:
节点结构:每个节点最多包含 m棵子树(即最多 m−1个关键字)。
根节点:根节点至少有 2 棵子树(除非根是叶子)。
非根内部节点:至少有 ⌈m/2⌉棵子树(即至少 ⌈m/2⌉−1个关键字)。
所有叶子节点:位于同一层,且不带信息(实际B树定义中,叶子节点通常为空或包含数据,不同教材有差异。常见定义:叶子节点不存储数据,只作为查找失败的终端;但在数据库实现中,B树节点常同时存储键值对)。
关键字顺序:节点内关键字递增排列,且子树指针满足:指针 Pi所指子树的所有关键字均大于 Ki且小于 Ki+1。
5.1.2 B 树性质
平衡性:所有叶子节点在同一层,保证绝对平衡。
高度 :对于包含 n个关键字的 m阶 B树,高度 h满足:
logm(n+1)≤h≤log⌈m/2⌉(n+12)+1 \log_{m}(n+1) \leq h \leq \log_{\lceil m/2 \rceil} \left( \frac{n+1}{2} \right) + 1 logm(n+1)≤h≤log⌈m/2⌉(2n+1)+1
搜索效率:一次搜索需访问的节点数不超过树高,通常 h很小(例如 3~4 层可管理大量数据)。
插入删除:通过分裂、合并节点维持平衡。
5.2 B+ 树定义与性质
5.2.1 B+树定义
B+树是 B树的变体,广泛应用于数据库索引。一棵 m阶 B+树满足:
节点子树数量:每个节点最多 m棵子树。
关键字与子树:非叶节点中,关键字个数等于子树个数减 1,关键字充当分隔值。
数据存储 :仅叶子节点存储数据(或数据指针),内部节点只存储索引(关键字)。
叶子链表:所有叶子节点通过指针链接成有序链表。
关键字范围:非叶节点的关键字是其对应子树中最大(或最小)关键字的副本,且所有关键字均出现在叶子层。
节点最小容量:根节点至少有两棵子树,其他非叶节点至少有 ⌈m/2⌉棵子树;叶子节点至少包含 ⌈m/2⌉个关键字。
5.2.2 B+树性质
数据全在叶子:查找必须走到叶子节点才能获得数据,查询路径长度稳定。
顺序访问高效:叶子链表支持高效的范围查询和全表遍历。
内部节点更"瘦":因不存数据,内部节点可容纳更多关键字,树更矮。
分裂方式 :插入时若节点满,分裂后中间关键字上浮到父节点,并在叶子层保留该关键字。
5.3 B树与B+树核心区别
| 对比维度 | B树 | B+树 |
|---|---|---|
| 数据存储位置 | 所有节点均可存储数据记录(键值对) | 仅叶子节点存储数据记录,内部节点只存索引键 |
| 叶子节点结构 | 叶子节点是独立的,无链表连接 | 叶子节点通过指针顺序链接,形成有序链表 |
| 查询性能 | 可能在任何节点命中,平均较快,但不稳定 | 必须走到叶子节点,稳定,且适合范围查询 |
| 关键字重复 | 关键字不重复出现(每个节点关键字唯一) | 内部节点的关键字重复出现在叶子节点中 |
| 存储利用率 | 节点存数据,故相同阶数下节点可容纳的关键字较少 | 内部节点仅存键,可存更多关键字,树更矮胖 |
| 适用场景 | 文件系统、少数数据库索引 | 主流数据库索引(如MySQL InnoDB) |
六 考点追踪
暂无