(一)B树
1.1 定义
B树又称为平衡多路查找树,相比于AVL树(平衡二叉树),B树的最大的特点就是节点内部有多个关键字以及有多个子节点。典型的B树如下图所示:
B树的阶数描述了每一个节点子节点的个数(上图为3阶B树)。图中“磁盘块I”是根节点,内部存储17和35两个关键字,有三个子节点。需要注意的是,最下方的“磁盘块5~11”叶子节点,他们的子节点,也就是空节点,代表着一次失败的搜索。
一个m阶B树需要满足下列条件:
- 所有节点至少有2个子节点;除根结点和叶子节点之外,所有节点最多有m个子节点
- 除根节点之外的所有节点至少有ceil(m/2)个子女
- 所有子节点位于同一层(同一高度,根节点高度为1)
- 非叶子节点若有n个子节点,那么他的关键字必须有n-1个,且按照升序排列
- 非叶子节点X的第i个子节点Y的关键字 ki ,需要满足 Ki−1<ki<Ki 。其中 Ki 是X节点的第i个关键字,若 i−1≤0 则 Ki−1=−inf 。
1.2 搜索与复杂度
如上图所示,寻找关键字36的过程为:
·【磁盘块1】:36>35 -> P3
->【磁盘块4】:36<65 -> P1
->【磁盘块9】:36=36 -> 成功
B树的搜索复杂度直接取决于其高度和阶数。搜索成功所需要的时间取决于关键字所在的层次,不成功的时间取决于树的高度。
【重要】如果给定总关键字个数N,那么B树的高度h应满足:
1.3 插入与删除
⋆ 从某个非根结点p开始,执行m阶B树的插入操作:
-> 节点p中小于m-1个关键码
- 直接插入
-> 节点p中已经有m-1个关键码,当再插入一个关键码后节点的状态为:
(m,P0,K1,P1,...Km,Pm)
- 把节点分裂为两个节点p_和q,它们包含的信息分别为:
{ s = ceil(m/2)-1 }
p_ : (s,P0,K1,P1,...,Ks,Ps)
q : (m-s,Ks,Ps,...Km,Pm)
- 新p_节点代替原来的p节点;位于中间的关键码Ks与指向新节点q的指针&q形成一个二元组(Ks,&q),插入到这两节点的父节点中去。
⋆ m阶B树的删除操作:
-> 非叶子节点:删除关键码Ki,用Pi指向的节点中最小的关键码代替之
-> 叶子节点:
- 分为四种情况。详见[B树删除操作](http://blog.csdn.net/qifengzou/article/details/21473739)
(二)B+树
与B树的不同
- 所有关键码都存放在叶节点中,上层非叶节点的关键码是其子树中最小/最大关键码的复写。
- 也节点包含了全部关键码和指向相应数据记录存放地址的指针,叶节点按照关键码从大到小顺序连接。