目录
B树和B+树
考纲内容
1.B树及其基本操作
1.1B树的查找
1.2B树的高度(磁盘存取次数)
1.3B树的插入
1.4B树的删除
2.B+树的基本概念
B树和B+树
考纲内容
考研大纲对 B树和 B+树的要求各不相同,重点在于考查B树,不仅要求理解B树的基本特点,还要求掌握 B树的建立、插入和删除操作,而对 B+树则只考查基本概念。
1.B树及其基本操作
所谓m阶B树(也可写成“B-树”,注意这里的“-”是连接词,不能读作“减”。)是所有结点的平衡因子均等于0的m路平衡查找树。
【命题追踪 ——B树的定义和特点(2009)】
一棵 m 阶 B树或为空树,或为满足如下特性的 m 叉树:
1) 树中每个结点至多有m棵子树,即至多有m-1个关键字。
2) 若根结点不是叶结点,则至少有2棵子树,即至少有1个关键字。
3) 除根结点外的所有非叶结点至少有棵子树,即至少有个关键字。
4) 所有非叶结点的结构如下:
其中,Ki(i=1,2,.….n)为结点的关键字,且满足K1<K2<…<Kn;
Pi(i=0,1,…,n)为指向子树根结点的指针,且指针 所指子树中所有结点的关键字均小于Ki,Pi所指子树中所有结点的关键字均大于Ki;
为结点中关键字的个数。
5) 所有的叶结点(大多数教材将B树的叶结点定义为失败结点,而408真题中却常将B树的叶结点定义为最底层的终端结点。)都出现在同一层次上,并且不带信息(可以视为外部结点或类似于折半查找判定树的失败结点,实际上这些结点并不存在,指向这些结点的指针为空)。
【命题追踪——B 树中关键字数和结点数的分析】
图7.28所示为一棵5阶B树,可以借助该实例来分析上述性质:
1)结点的孩子个数等于该结点中关键字个数加1。
2)若根结点没有关键字就没有子树,则此时B树为空;
若根结点有关键字,则其子树个数必然大于或等于 2,因为子树个数等于关键字个数加1。
3)除根结点外的所有非叶结点至少有棵子树(即至少有个关键字);至多有5棵子树(即至多有4个关键字)。
4)结点中的关键字从左到右递增有序,关键字两侧均有指向子树的指针,左侧指针所指子树的所有关键字均小于该关键字,右侧指针所指子树的所有关键字均大于该关键字。
或者看成下层结点的关键字总是落在由上层结点的关键字所划分的区间内,如第二层最左结点的关键字划分成了3个区间:(-∞,5),(5,11),(11,+∞),该结点中的3个指针所指子
树的关键字均分别落在这3个区间内。
5)所有叶结点均在第4层,代表查找失败的位置。
1.1B树的查找
在B树上进行查找与二叉排序树很相似,只是每个结点都是多个关键字的有序表,在每个结点上所做的不是两路分支决定,而是根据该结点的子树所做的多路分支决定。
B树的査找包含两个基本操作:
① 在 B树中找结点;
② 在结点内找关键字。
由于B树常存储在磁盘上,则前一查找操作是在磁盘上进行的,而后一查找操作是在内存中进行的,即在磁盘上找到目标结点后,先将结点信息读入内存,然后再采用顺序查找法或折半查找法。
因此,在磁盘上进行查找的次数即目标结点在B树上的层次数,决定了B树的查找效率。
在B树上查找到某个结点后,先在有序表中进行查找,若找到则查找成功,否则按照对应的指针信息到所指的子树中去査找
B树查找操作举例:
(例如,在图 7.28 中查找关键字 42,
首先从根结点开始,根结点只有一个关键字,且 42>22,若存在,必在关键字 22 的右边子树上,右孩子结点有两个关键字,
而 36<42<45,则若存在,必在 36 和 45 中间的子树上,在该子结点中查到关键字 42,查找成功)。
查找到叶结点时(对应指针为空),则说明树中没有对应的关键字,查找失败。
1.2B树的高度(磁盘存取次数)
由上一节得知,B树中的大部分操作所需的磁盘存取次数与B树的高度成正比。
下面来分析B树在不同情况下的高度。当然,首先应该明确B树的高度不包括最后的不带任何信息的叶结点所处的那一层(有些书对 B树的高度的定义中,包含最后的那一层)。
若 n≥1,则对任意一棵包含n个关键字、高度为 h、阶数为 m的 B树:
1)若让每个结点中的关键字个数达到最多,则容纳同样多关键字的 B 树的高度达到最小。
因为 B树中每个结点最多有m棵子树,m-1个关键字,所以在一棵高度为h的m阶 B树中关键字的个数应满足
,因此有
2)若让每个结点中的关键字个数达到最少,则容纳同样多关键字的 B树的高度达到最大。
第一层至少有1个结点;
第二层至少有2个结点;
除根结点外的每个非叶结点至少有棵子树,则第三层至少有个结点……第 h+1层至少有个结点,注意到第h+1层是不包含任何信息的叶结点。
对于关键字个数为n的B树,叶结点即查找不成功的结点为n+1,由此有,即 。
例如,假设一棵3阶 B树共有8个关键字,则其高度范围为2<=h<=3.17,取整数。
1.3B树的插入
【命题追踪——通过插入操作构造一棵初始为空的 B树】
与二叉排序树的插入操作相比,B树的插入操作要复杂得多。在B树中查找到插入的位置后,并不能简单地将其添加到终端结点(最底层的非叶结点)中,因为此时可能会导致整棵树不再满足 B树定义中的要求。
将关键字 key 插入 B树的过程如下:
1) 定位。
利用前述的 B树查找算法,找出插入该关键字的终端结点(在B树中查找 key 时,会找到表示查找失败的叶结点,因此插入位置一定是最底层的非叶结点)。
2) 插入。
每个非根结点的关键字个数都在。
若结点插入后的关键字个数小于 m,可以直接插入;
若结点插入后的关键字个数大于m-1,必须对结点进行分裂。
分裂的方法是:
取一个新结点,在插入 key后的原结点,
从中间位置将其中的关键字分为两部分,
左部分包含的关键字放在原结点中,
右部分包含的关键字放到新结点中,
中间位置的结点插入原结点的父结点。
若此时导致其父结点的关键字个数也超过了上限,则继续进行这种分裂操作,直至这个过程传到根结点为止,进而导致B树高度增1。
对于m=3的B树,所有结点中最多有m-1=2个关键字,若某结点中已有两个关键字,则结点已满,如图 7.29(a)所示。
插入一个关键字 60 后,结点内的关键字个数超过了 m-1,如图 7.29(b)所示,此时必须进行结点分裂,分裂的结果如图 7.29(c)所示。
1.4B树的删除
B树的删除操作与插入操作类似,但要稍微复杂一些,即要使得删除后的结点中的关键字个数,因此将涉及结点的“合并”问题。
【命题追踪——B 树的删除操作的实例(2012,2022)】
当被删关键字k不在终端结点中时,可以用k的前驱(或后继)k',
即k的左侧子树中“最右下”的元素(或右侧子树中“最左下”的元素),来替代k,
然后在相应的结点中删除k',关键字k'必定落在某个终端结点中,则转换成了被删关键字在终端结点中的情形。
在图7.30的4阶B树中,删除关键字 80,用其前驱 78 替代,然后在终端结点中删除 78。
因此只需讨论被删关键字在终端结点中的情形,有下列三种情况:
1)直接删除关键字。
若被删关键字所在结点删除前的关键字个数,表明删除该关键字后仍满足B树的定义,则直接删去该关键字。
2)兄弟够借。
若被删关键字所在结点删除前的关键字个数,且与该结点相邻的右(或左)兄弟结点的关键字个数,则需要调整该结点、右(或左)兄弟结点及其双
亲结点(父子换位法),以达到新的平衡。
在图 7.31(a)中删除 4阶 B树的关键字 65,右兄弟关键字个数,将 71 取代原 65 的位置,将 74 调整到 71 的位置。
3)兄弟不够借。
若被删关键字所在结点删除前的关键字个数,且此时与该结点相邻的左、右兄弟结点的关键字个数都,则将关键字删除后与左(或右)兄弟结
点及双亲结点中的关键字进行合并。
在图 7.31(b)中删除4阶 B树的关键字 5,它及其右兄弟结点的关键字个数,所以在5删除后将 60 合并到 65 结点中。
【命题追踪——非空B树的查找、插入、删除操作的特点】
在合并过程中,双亲结点中的关键字个数会减1。
若其双亲结点是根结点且关键字个数减少至 0(根结点关键字个数为1时,有2棵子树),则直接将根结点删除,合并后的新结点成为根;
若双亲结点不是根结点,且关键字个数减少到,则又要与它自己的兄弟结点进行调整或合并操作,并重复上述步骤,直至符合B树的要求为止。
2.B+树的基本概念
【命题追踪——B+树的应用场合(2017)】
B+树是应数据库所需而出现的一种B树的变形树。
一棵 m 阶 B+树应满足下列条件:
1)每个分支结点最多有m棵子树(孩子结点)。
2)非叶根结点至少有两棵子树,其他每个分支结点至少有棵子树。
3)结点的子树个数与关键字个数相等。
4)所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来(支持顺序查找)。
5)所有分支结点(可视为索引的索引)中仅包含它的各个子结点(即下一级的索引块)中关键字的最大值及指向其子结点的指针。
【命题追踪——B 树和 B+树的差异的分析(2016)】
m阶B+树与m阶B树的主要差异如下:
1)在 B+树中,具有n个关键字的结点只含有n棵子树,即每个关键字对应一棵子树;
而在B树中,具有n个关键字的结点含有n+1棵子树。
2)在 B+树中,每个结点(非根内部结点)的关键字个数n的范围是(非叶根结点:2≤n≤m);
而在B树中,每个结点(非根内部结点)的关键字个数n的范围是(根结点:1≤n≤m-1)。
3)在 B+树中,叶结点包含了全部关键字,非叶结点中出现的关键字也会出现在叶结点中;
而在B树中,最外层的终端结点包含的关键字和其他结点包含的关键字是不重复的。
4)在 B+树中,叶结点包含信息,所有非叶结点仅起索引作用,非叶结点的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有对应记录的存储地址。
这样能使一个磁盘块存储更多的关键字,使得磁盘读/写次数更少,查找速度更快。
5)在 B+树中,用一个指针指向关键字最小的叶结点,将所有叶结点串成一个线性链表。
图 7.32 所示为一棵4阶 B+树。可以看出,分支结点的关键字是其子树中最大关键字的副本。
通常在 B+树中有两个头指针:一个指向根结点,另一个指向关键字最小的叶结点。
因此,可以对 B+树进行两种查找运算:
- 一种是从最小关键字开始的顺序查找,
- 另一种是从根结点开始的多路查找。
B+树的查找、插入和删除操作和 B树的基本类似。
只是在查找过程中,非叶结点上的关键字值等于给定值时并不终止,而是继续向下查找,直到叶结点上的该关键字为止。
所以,在B+树中查找时,无论查找成功与否,每次查找都是一条从根结点到叶结点的路径。