1 B树
1.1 基础知识
含义: 多路平衡查找树
阶: B树中所有结点的孩子结点数的最大值,用m表示
特点:
1) 树的每个结点至多有m棵子树(m-1个关键字)
2) 若根结点不是终端结点,则至少有两棵子树
3) 除根节点以外的所有非叶结点至少有m/2向上取整棵子树
4) 所有非叶节点结构如下:
n Po K1 P1 K2 ... Kn Pn
解释:
K表示关键字,P表示指向子树根节点的指针,n为结点中关键字个数。
满足: Pi-1所指子树的所有结点的关键字都小于Ki, Pi所指子树的所有结点的关键字都大于Ki。
5) 所有叶节点都出现在同一层次上,并且不带信息。表示是查找失败结点。
总结: m棵子树,非叶节至少有m/2向上取整棵子树,Pi-1所指节点<Ki<Pi所指节点
三阶B树样例:
18 33
12 23 30 48
10 15 20 21 24 31 45 47 50 52
空 空 空 空 空空空空空空空空空空空空空空空空
1.2 B树高度(磁盘存取次数)
B树的高度不包括最后的不带任何信息的叶节点所处的那一层。
若n>=1,对任意一棵包含n个关键字,高度为h,阶数为m的B树:
1) 每个结点最多有m棵子树, m-1个关键字,满足:
n <= (m-1)*(1 + m + m^2 + ... + m^(h-1)) = m^h - 1
即: h >= LOGm(n+1)
2) 若每个结点中关键字个数最少,第一层有1个结点,第二层有2个结点,
除根节点以外的每个非终端结点至少有m/2向上取整棵子树,第三层至少有2[m/2],
第h+1层至少有2([m/2])^(h-1),对于关键字个数为n的B树,叶节点即查找不成功的结点为
n+1,n+1>=2([m/2])^(h-1),即 h <= LOG[m/2]((n+1)/2) + 1
1.3 B树的查找
每个结点都是多个关键字的有序表,根据该结点的子树所做的多路分支决定。
B树查找包含:
1)在B树种找结点
2)在结点内找关键字(可采用折半查找等于K的关键字)
查找到某个结点后,先在有序表中进行查找,若找到则查找成功,否则按照对应指针信息到所
指的子树中取查找。当查找到叶节点,则查找失败。
1.4 B树的插入
1) 定位
利用B树查找算法,找出插入该关键字的最底层中某个非叶节点
2) 插入
每个非失败结点的关键字个数都在[m/2向上取整-1, m-1]之间。
当插入的关键字个数<=m-1,则直接插入;否则,需要进行分裂
3) 分裂
取一个新结点,将插入key后的原结点从中间位置将关键分为两部分,
左部分包含的关键字放在原结点,
右部分包含的关键字放在新结点,
中间位置m/2的结点插入到原结点的父节点中。若父节点关键字个数也超出上限,则继续分裂。
样例:
m为3的B树如下:
30
20 50 52
插入60
30
20 50 52 60
分裂后
30 52
20 50 60
1.5 B树的删除
要使得删除后的结点中的关键字个数>=m/2向上取整-1,因此设计结点的合并问题。
1.5.1) 当所删除的关键字k不在终端结点(最底层非叶节点)中时,
1) 如果小于k的子树中关键字个数 > m/2向上取整-1,则找出k的前驱值k*,用k*取代k,
再递归删除k*即可。
2) 如果大于k的子树中关键字个数 > m/2向上取整-1,则找出k的后继值k*,用k*取代k,
再递归删除k*即可。
3) 如果前后两个子树中关键字个数均为m/2向上取整-1,则直接将两个子结点合并,直接删除k即可。
样例:
4阶B树如下
5 7 9
3 6 8 10
删除7变为
5 9
3 6 8 10
1.5.2) 当被删除的关键字在终端结点(最底层非叶节点)
1) 直接删除关键字
若被删除关键字所在结点的关键字个数 > m/2向上取整-1,表明删除关键字满足B树定义,直接删除
2) 兄弟够借
若被删除关键字所在结点删除前关键字个数=m/2向上取整-1,且与此结点相邻的右(左)兄弟结点
的关键字个数>=m/2向上取整,则需要调整该及结点、右(左)兄弟结点及其双亲结点(父子换位法),以达到新的平衡
60 71
5 65 74 86
删除65,兄弟够借,将删除结点的父节点取代待删除结点位置,将其右兄弟第一个结点取代待删除结点原来父节点的位置
60 74
5 71 86
3) 兄弟不够借
若被删除关键字所在结点删除前的关键字个数为m/2向上取整-1,左右兄弟结点关键字个数也是m/2向上取整-1,
则将关键字删除后与右(左)兄弟结点以及双亲结点中的关键字进行合并。
60 74
5 71 86
删除5,兄弟不够借
74
60 71 86
若合并过程中,双亲结点关键字个数减为0,则删除该根结点,合并后的新结点称为根结点;
若双亲结点不是根结点,且关键字个数减少为m/2向上取整-2,则需要与兄弟结点进行调整或合并。
2 B+树
2.1 B+树条件
一棵m阶B+树满足如下条件:
1) 每个分治结点最多有m棵子树
2) 根节点至少有两个子树&