数据结构(B树和B+树)
9.2、B 树
了解B树之前,先来了解一下m叉查找树
可以类比二叉查找树(排序树)的来了解m叉查找树;我们这里以5叉查找树为例子
二叉查找树有一个关键字和2个孩子,左孩子 < 根结点 < 右孩子的数据,递归下去
5叉查找树有4个关键字,五个孩子指针,都以数组的形式来保存;每个结点中,数组下标大的大于数组下标小的。
第一个孩子小于第一个关键字小于第二个孩子
child[0]孩子数据 < keys[0] < child[1]孩子数据 < keys[1] < child[2]孩子数据 < keys[2] ......
5叉查找树
typedef struct BFiveNode{
Elemtype keys[4];//最多保存四个关键字(数据)
struct BFiveNode *child[5];//最多五个孩子
int num;//结点中几个关键字
}BFiveNode,*BFiveTree;
5叉查找树如下图所示
比如这里需要查找一个元素9
如果每个结点的关键字较少,如果每个结点只有一个关键字,那么它就有两个孩子指针,那么5叉查找树就退化成了二叉查找树;
如何保证查找效率?
策略:为了保证m叉查找树的查找效率,尽量的要每个结点的关键字多
- m叉查找树中,规定除了根结点以外,任何结点至少要有\(\left \lceil \frac{m}{2} \right \rceil\)个分叉,即至少含有\(\left \lceil \frac{m}{2} \right \rceil -1\)个关键字
- eg:对于5叉查找树,除了根结点外,其他结点只有要有3个分叉,2个关键字
- m叉查找树中,规定任何一个结点,其所有子树的高度都要相同。
如果满足以上两个策略的5叉查找树,就是一颗B树,5阶B树;B树又称多路平衡查找树
m阶B树的特点:
- m叉查找树中,规定除了根结点以外,任何结点至少要有\(\left \lceil \frac{m}{2} \right \rceil\)个分叉,即至少含有\(\left \lceil \frac{m}{2} \right \rceil -1\)个关键字
- m叉查找树中,规定任何一个结点,其所有子树的高度都要相同。
- 树中结点至多有m颗子树,至多m-1个关键字
- 所有叶子结点都出现在同一层次上,且不带信息。
- child[0]孩子数据 < keys[0] < child[1]孩子数据 < keys[1] < child[2]孩子数据 < keys[2] ......
这就是一颗5阶B树
问题:含有n个关键字的m阶B树,最小高度、最大高度是多少?(计算高度不包含无信息的叶子结点)
答:
要算最小高度,尽可能的让每个结点满,每个结点最多有m-1个关键字
第一层只有一个结点,底二层m个结点,第三层\(m^2\)个结点......
所以:\(n \le (m-1)(1+m+m^2+m^3+...+m^{h-1}) = m^h-1\)
=> \(log_m(n+1) \le h\)
要算最大高度,尽可能的让分叉少,也就是每个结点的关键字少,同时要需要满足m解B树的特性
对于根结点最多有2个分叉(最少一个分叉),对于其他结点最多有\(\left \lceil \frac{m}{2} \right \rceil\)个分叉
第一层有1个结点,第二层有2,第三层有2\(\left \lceil \frac{m}{2} \right \rceil\),第三层有\(\left \lceil \frac{m}{2} \right \rceil^2\),......第h层2$\left \lceil \frac{m}{2} \right \rceil^{h-2} $
第h+1层有$2\left \lceil \frac{m}{2} \right \rceil^{h-1} $个叶子结点
n个关键字的B树必有n+1个叶子结点,
所以:\(2\left \lceil \frac{m}{2} \right \rceil^{h-1} \le n+1\)
=> \(h-1 \le log_{\left \lceil \frac{m}{2} \right \rceil}{\frac{n+1}{2}}\)
=> \(h \le log_{\left \lceil \frac{m}{2} \right \rceil}({\frac{n+1}{2}}) +1\)
B树的插入操作
以5阶B树的为例,图的形式
B树的插入操作
以5阶B树的为例,图的形式
9.3、B+树
一棵m阶的B+树需要满足的条件:
- 每个分支点最多有m棵子树(孩子结点)
- 非叶根结点至少有两棵子树,其他每个分支结点至少有\(\left \lceil \frac{m}{2} \right \rceil\)棵子树
- 结点的子树数目和关键字相等
- 所有叶子结点的包含全部关键字及其指向相应记录的指针,叶结点中将关键字按大小顺序排序,并且相邻叶结点按大小顺序相互连接起来
- 所有分支结点中仅包含它的各个子结点中关键字的最大值及指向其结点的指针
查找元素
注意:B+的多路查找无论是查找成功或者失败,都需要走到最后一层叶子结点。(这是多路查找)
也可以根据指针p按顺序查找
B+树应用:关系型数据库的”索引“(如Mysql)。