B树、B-树、B+树与B*树

B树

B树的定义(多路平衡查找树)

B树又称为多路平衡查找树,B树中所有结点的孩子结点数的最大值称为B树的阶,通常用m表示。一棵m阶B树或为空树,或为满足如下性质的m叉树:

①树中每个结点之多有m棵子树(即之多含有m-1个关键字)
②若根结点不是终端结点,则至少有两棵子树
③除根结点外的所有非叶结点至少有⌈m/2⌉棵子树(则至少含有⌈m/2⌉-1个关键字)
④所有非叶结点的结构如下:
《B树、B-树、B+树与B*树》
其中ki,(i=1,2,……,n)为结点的关键字,切满足Ki单调递减;
Pi(i=0,1,2,……,n)为指向子树根结点的指针,且指针Pi-1所指子树中所有结点的关键字均小于Ki,Pi,所指子树所有结点的关键字均大于Ki,n(⌈m/2⌉<=n<=m-1)为结点中关键字的个数

⑤所有的叶结点都出现在同一层次上,并且不带信息(可以看做是外部结点或者类似于折半查找判定树的查找失败结点,实际上这些结点不存在,指向这些节点的指针为空)
《B树、B-树、B+树与B*树》

B树的查找

在B树上进行查找与二查找树很相似,只是每个结点都是多个关键字的有序表,在每个结点上所做的不是两路分支界定,而是根据该结点的子树所做的多路分支决定。

B树的查找包含两个基本操作:
①在B树中找到结点
②在结点内找关键字。
由于B树常存储在磁盘上,则前一个查找操作是在磁盘上进行的,而后一个查找操作是在内存中进行的,即在找到目标结点后,先将结点中的信息读入内存,然后再采用顺序查找发或折半查找法查找等于K的关键字

在B树上查找到某个结点后,现在有序表中查找,若找到则查找成功,否则按照对应的指针信息到所指的子树中去查找(例如,在下图中查找第一层的第一个结点时,若发现关键字大于18而小于33,则在这个结点上查找失败,将根据18与33之间的指针到结点的第二个子树中继续查找。)当查找到叶结点时(对应的指针为空指针),则说明树中没有对应的关键字,查找失败。

B树的插入

与二叉查找树的插入操作相比,B树的插入操作要复杂得多。在二叉查找树中,仅需要查找到需插入的终端节点的位置。但是在B树中找到插入的位置后,并不能简单地将其添加到终端结点中去,因为此时可能会导致整棵树不再满足B树中定义中的要求。将关键字key插入到B树的过程如下

①定位:利用前述的B树查找算法,找出插入该关键字的最底层中某个非叶结点(注意,B树中的插入关键字一定是插入在最底层中的某个非叶结点)

②插入:在B树中,每个非失败结点的关键字个数都在【⌈m/2⌉-1,m-1】之间,将插入胡的结点关键字个数小于m,则可以直接插入;插入后检查被插入节点内关键字的个数,党插入后的结点关键字个数大于m-1时,则必须对结点进行分裂

分裂的方法是:取一个新结点,将插入key后的原结点从中间位置将其中的关键字分为两部分,做部分包含的关键字放在原结点中,右部分包含的关键字放到新的结点中,中间位置后(⌈m/2⌉)的结点插入到原结点的父结点中。若此时导致其父结点的关键字个数也超过了上限,则继续进行这种分裂操作,直至这个过程传到根节点为止,这样导致B树高度增1。

对于m=3的B树,所有结点中最多有m-1=2个关键字,若某结点中已有两个关键字时,则结点已满。
如图,当插入一个关键字60后,节点内的关键字个数超出了m-1,如图所示,此时必须进行结点分裂,分裂的结果如图
《B树、B-树、B+树与B*树》

B树的删除

B树中的删除操作与插入操作类似,但要稍微复杂一些,要使得删除后的结点中的关键字个数≥⌈m/2⌉-1,因此将涉及结点的“合并”问题

当所删除的关键字k不在终端节点(最低层非叶结点)中时,有下列几种情况:
①如果小于k的子树中关键字个数大于⌈m/2⌉-1,则找出k的前驱值k’,并用k’代替k,再递归删除k’即可
②如果大于k的子树中关键字个数大于⌈m/2⌉-1,则找出k的后继值k‘,并用k’来取代K,再递归地删除K’即可。
③如果前后两个子树中关键字个数均为⌈m/2⌉-1,则直接将两个子节点合并,直接删除K即可
《B树、B-树、B+树与B*树》

当被删除的关键字在终端结点(最底层非叶结点)中时,有下列几种情况:
①直接删除关键字:若被删除关键字所在结点的关键字个数大于⌈m/2⌉-1,表明删除该关键字后仍满足B树定义,则直接删去该关键字。
②兄弟够借:若被删除关键字所在结点删除前的关键字个数等于⌈m/2⌉-1,切与此结点相邻的右(左)兄弟结点的关键字个数≥⌈m/2⌉-1,需要调整该结点,右(左)兄弟结点以及其双亲结点(父子换位法),以到达新的平衡
③兄弟不够借:若被删除关键字所在结点删除前的关键字个数等于⌈m/2⌉-1,且此时与该结点相邻的右(左)兄弟结点的关键字个数等于⌈m/2⌉-1,则将关键字删除后与右(左)兄弟结点及双亲结点中的关键字进行合并

在合并的过程中,双亲结点中的关键字个数会减少。若其双亲结点是根节点并且关键字个数减少至0,(根节点关键字个数为1时,有2棵子树),则直接将根结点删除,合并后的新结点称为根;若双亲结点不是根结点,切关键字个数减少到⌈m/2⌉-2,又要与它自己的兄弟结点进行调整或合并操作,并重复上述步骤,直至符号B树的要求为止
《B树、B-树、B+树与B*树》

B+树

B+树是应数据库所需儿出现的一种B树的变形树

B+树的定义

一棵m阶的B+树需满足下列条件

①每个分支结点最多有m棵子树(子结点)
②非叶根节点至少有两棵子树,其他每个分支节点至少有⌈m/2⌉棵子树
③结点的子树个数与关键字个数相等
④所有叶节点包含全部关键字及指向相应记录的指针,而且也及诶单中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来
⑤所有分支节点(棵看成是索引的索引)中仅包含它的各个子结点(即下一级的索引块)中关键字的最大值及指向其子结点的指针

B+树与B树的差异

m阶B+树与m阶B树的主要差异在于:
①在B+树中,具有n个关键字的结点只含有n棵子树,即每个关键字对应一棵子树;而在B树中,具有n个关键字的结点含有(n+1)棵子树

②在B+树中,每个结点(非根节点)关键字个数n的范围是⌈m/2⌉≤n≤m(根结点1≤n≤m),在B树中,每个结点(非根节点)关键字个数n的范围是⌈m/2⌉-1≤n≤m-1(根结点1≤n≤m-1)

③在B+树中,叶结点包含信息,所有非叶结点仅起到索引作用,非叶结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址。

④在B+树中,叶结点包含了全部关键字,即在非叶结点中出现的关键字也会出现在叶结点中;而在B树中,叶结点包含的关键字和其他结点包含的关键字是不重复的。

图为一棵4阶B+树的示例。从图中可以看出,分支结点的某个关键字是其子树中最大关键字的副本。通常在B+树中有两个头指针:一个指向根节点,另一个指向关键字最小的叶结点。因此,可以对B+树进行两种查找运算:一种是从最小关键字开始的顺序查找,另一种是从根节点开始,进行多路查找
《B树、B-树、B+树与B*树》

B+树的查找,插入和删除操作和B树基本类似。只是在查找过程中,如果非叶结点上的关键字值等于给定值时,并不终止,而是继续向下查找直到叶结点上的该关键字为止。所以,在B+树中查找,无论查找成功与否,每次查找都是一条从根结点到叶结点的路径

B*树

B*树的定义

B*树是B+树的变体,在B+树的非根和非叶子结点再增加指向兄弟的指针;B*树定义了非叶子结点关键字个数至少为(2/3)*M,即块的最低使用率为2/3(代替B+树的1/2)
《B树、B-树、B+树与B*树》

B*树的分裂

当一个结点满时,如果它的下一个兄弟结点未满,那么将一部分数据移到兄弟结点中,再在原结点插入关键字,最后修改父结点中兄弟结点的关键字(因为兄弟结点的关键字范围改变了);如果兄弟也满了,则在原结点与兄弟结点之间增加新结点,并各复制1/3的数据到新结点,最后在父结点增加新结点的指针;

B-树

百度定义

B-tree树即B树,B即Balanced,平衡的意思。因为B树的原英文名称为B-tree,而国内很多人喜欢把B-tree译作B-树,其实,这是个非常不好的直译,很容易让人产生误解。如人们可能会以为B-树是一种树,而B树又是另一种树。而事实上是,B-tree就是指的B树。特此说明。

    原文作者:B树
    原文地址: https://blog.csdn.net/xiaojie_570/article/details/53946910
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞