【摘要】
【主题】
- B-Tree 介绍
- B-Tree 特性搜索插入等
- B+Tree 介绍
- B*Tree 介绍
【内容】
1. B-Tree 介绍
一棵m阶的B树满足下列条件:
- 树中每个结点至多有m个孩子;
- 除根结点和叶子结点外,其它每个结点至少有m/2个孩子;
- 若根结点不是叶子结点,则至少有2个孩子;
- 所有叶子结点(失败节点)都出现在同一层,叶子结点不包含任何关键字信息;
- 所有非终端结点中包含下列信息数据 ( n, A0 , K1 , A1 , K2 ,A2 , … , Kn , An ),其中: Ki (i=1,…,n)为关键字,且Ki < Ki+1 ,Ai (i=0,…,n)为指向子树根结点的指针, n为关键字的个数
- 非叶子结点的指针:P[1], P[2], …,P[M];其中P[1]指向关键字小于K[1]的子树,P[M]指向关键字大于K[M-1]的子树,其它P[i]指向关键字属于(K[i-1],K[i])的子树;
-- 图1 B-tree示意图
2. B-Tree特性
2.1 B-Tree 特性
- 关键字集合分布在整颗树中;
- 任何一个关键字出现且只出现在一个结点中;
- 搜索有可能在非叶子结点结束;
- 其搜索性能等价于在关键字全集内做一次二分查找;
- 自动层次控制;
2.2 B-Tree搜索原理
B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点;因此,B-Tree的查找过程是一个顺指针查找结点和在结点的关键字中进行查找的交叉进行的过程。
-- 图2 高度与关键码的计算过程
2.3 B-Tree 插入
这时必须把结点 p 分裂成两个结点 p 和q,它们包含的信息分别为:
3. B+Tree
3.1 B+Tree定义
一棵 m阶B+树可以定义如下:
- 树中每个非叶结点最多有 m 棵子树;
- 根结点 (非叶结点) 至少有 2 棵子树。除根结点外, 其它的非叶结点至少有ém/2ù 棵子树;有 n 棵子树的非叶结点有 n-1 个关键码。
- 所有叶结点都处于同一层次上,包含了全部关键码及指向相应数据对象存放地址的指针,且叶结点本身按关键码从小到大顺序链接;
- 每个叶结点中的子树棵数 n 可以多于 m,可以少于m,视关键码字节数及对象地址指针字节数而定。
- 若设结点可容纳最大关键码数为 m1,则指向对象的地址指针也有 m1个。
- 结点中的子树棵数 n 应满足 n 属于[m1/2, m1]
- 若根结点同时又是叶结点,则结点格式同叶结点。
- 所有的非叶结点可以看成是索引部分,结点中关键码 Ki 与指向子树的指针 Pi构成对子树 (即下一层索引块) 的索引项 ( Ki, Pi ),Ki 是子树中最小的关键码。
- 特别地,子树指针 P0 所指子树上所有关键码均小于K1。结点格式同B树。
- 叶结点中存放的是对实际数据对象的索引。
- 在B+树中有两个头指针:一个指向B+树的根结点,一个指向关键码最小的叶结点。
B+Tree与B-Tree区别
- 非叶子结点的子树指针与关键字个数相同;
- 非叶子结点的子树指针P[i],指向关键字值属于[K[i],K[i+1])的子树(B-树是开区间);
- 为所有叶子结点增加一个链指针;
- 所有关键字都在叶子结点出现;
对B+树进行两种搜索运算
- 循叶结点链顺序搜索
- 另一种是从根结点开始,进行自顶向下,直至叶结点的随机搜索。
-- 图3 B+Tree示意图
3.2 B+Tree特性
B+Tree的特性
- 所有关键字都出现在叶子结点的链表中(稠密索引),且链表中的关键字恰好是有序的;
- 不可能在非叶子结点命中;
- 非叶子结点相当于是叶子结点的索引(稀疏索引),叶子结点相当于是存储(关键字)数据的数据层;
- 更适合文件索引系统
4. B*Tree
4.1 B*Tree
-- 图4 B*Tree示意图