B-树和B+树

B-树

概念:
B-树是一种平衡的多路查找树,它在文件系统中很有作用。

一棵m阶的B-树,或为空树,或为满足下列特性的m叉树:

  1. 树中每个结点至多有m棵子树;
  2. 若根节点不是叶子结点,则至少有两棵子树;
  3. 除根之外的所有非终端结点至少有(不小于m/2的最小整数)棵子树;
  4. 所有的非终端结点包含下列信息数据
    (n,A0,K1,K2,…,Kn,An)(实际上在B-树的每个结点中还应包含n个指向每个关键字的记录的指针)

其中:Ki(i=1,…,n)为关键字,且Ki<ki+1(i=1,…,n-1);Ai(i=0,…,n)为指向子树根节点的指针,且指针Ai-1所指子树中所有结点的关键字均小于Ki(i=1,…,n),An所指子树中所有结点的关键字均大于Kn, n为关键字个数

  1. 所有的叶子结点都出现在同一层次上,并且不带信息(可以看作是外部结点或查找失败的结点,实际上这些结点不存在,指向这些结点的指针为空)

查找算法思想
如图为一棵4阶的B-树,其深度为4.
在这里插入图片描述
查找过程:
B-树上进行查找与二叉排序树类似。例如在B-树上查找关键字47的过程如下:首先从根开始,根据根节点指针t找到* a结点,因*a结点中只有一个关键字,且给定值47>关键字35,则若存在必在指针A1所指的子树内,顺指针找到 * c结点,该结点有两个关键字(43和78),而43<47<78,则若存在必在指针A1所指的子树中。同样,顺指针找到 * g结点,在该结点中顺序查找找到关键字47,由此,查找成功。查找不成功的过程也类似,例如在同一棵树中查找23.从根开始,因为23<35,则顺该结点中第二个指针A0找到 * b结点,又因为 *b结点中只有一个关键字18,而23>18,所以顺结点中第二个指针 Ai找到 *e结点。同理23<27,则顺指针往下找,此时因指针所指结点为叶子结点,说明此棵B-树中不存在关键字23,查找失败而告终。

B-树的插入和删除

插入过程
B-树的生成也是从空树起,逐个插入关键字而得。但由于B-树结点中的关键字个数必须>=a-1(a为不于m/2的最大整数),因此每次插入一个关键字不是在树中添加一个叶子结点,而是首先在最低层的某个非终端结点中添加一个关键字,若该结点的关键字个数不超过m-1,则插入完成,否则要产生结点的“分裂”,如图所示。
例如,(a)所示为3阶的B-树(图中略去F结点(即叶子结点)),假设需依次插入关键字30,26,85和7.首先通过查找确定插入的位置。由根* a起进行查找,确定30应插入在* d结点中,由于* d中关键字数目不超过2(即m-1),故第一个关键字应插入完成。插入30后的B-树如图(b)所示。同样,通过查找确定关键字26亦应插入在 *d结点中。由于 *d中关键字的数目超过2,此时需将 *d分裂成两个结点。关键字26及其前,后两个指针仍保留在 *d结点中,而关键字37及其前,后两个指针存储到新产生的结点 * d’中。同时,将关键字30和指示结点 *d’的指针插入到其双亲结点中。由于 *b结点中的关键字数目没有超过2,则插入完成。插入后的B-树如图(d)所示。类似地,在 *g中插入85之后需分裂成两个结点,而当70继而插入到双亲结点时,由于 *e中关键字数目超过2,则再次分裂为结点 *e和 * e’,如图 (g)所示。最后在插入关键字7时, * c , * b和 *a相继分裂,并生成一个新的根节点 *m,如图(h)~(j)所示。
在这里插入图片描述

在这里插入图片描述
删除过程
若在B-树上删除一个关键字,则首先应找到该关键字所在结点,并从中删除之,若该结点为最下层的非终端结点,且其中的关键字数目不少于a(a为不小于m/2的最小整数) ,则删除完成,否则要进行“合并”结点的操作。假若所删关键字为非终端结点中的Ki,则可以指针Ai所指子树中的最小关键字Y替代Ki,然后在相应的结点中删掉Y。例如上图(a)的B-树上删除45,可以* f结点中的50替代45,然后在* f中删去50.因此,下面我们只需讨论删去最下层非终端结点中关键字的情形。有下列3种可能:

  1. 被删除关键字所在结点中的关键字数目不小于a(a为不小于m/2的最小整数)则只需从该结点中删去该关键字Ki和相应指针Ai,树的其他部分不变,例如,从上图(a)中删除12,删除后如下图(a)所示。
  2. 被删关键字所在结点中的关键字数目等于a-1(a为不小于m/2的最小整数)而与该结点相邻的右兄弟(或左兄弟)结点中的关键字数目大于a-1,则需将其兄弟结点中的最小(或最大)的关键字上移至双亲结点中,而将双亲结点中小于(或大于)且紧靠该上移关键字的关键字下移至被删除关键字所在结点中。例如从下图(a)中删去50,需将其右兄弟结点中的61上移至* e结点中,而将 * e结点中的53移动至 * f,从而使* f和* g中关键字数目均不小于a-1,而双亲结点中的关键字数目不变,如下图(b)所示。
  3. 被删除关键字所在结点和其相邻的兄弟结点中的关键字数目均等于a-1。假设该结点有右兄弟,其右兄弟结点地址由双亲结点中的指针Ai所指,则在删去关键字之后,它所在结点中剩余的关键字和指针,加上双亲结点中的关键字Ki一起,合并到Ai所指兄弟结点中(若没有右兄弟,则合并至左兄弟结点中)。例如,从下图(b)所示中删去53,则应删去f结点,并将f中的剩余信息(指针“空”)和双亲e结点中的61一起合并到右兄弟结点g中。删除后的树如下图(c)所示。如果因此双亲结点中的关键字数目小于a-1,则一次类推做相应处理。例如,在下图c中删去37之后,双亲b结点中剩余信息(指针"c")应和其双亲结点a结点中的关键字45一起合并至右兄弟结点e中,删除后如下图(d)所示。

在这里插入图片描述

B+树
B+树是应文件系统所需而出的一种B-树的变型树。一棵m阶的B+树和m阶的B-树的差异在于:

  1. 有n棵子树的结点中含有n个关键字。
  2. 所有的叶子结点中包含了全部关键字的信息,及指向含这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
  3. 所有的非终端结点可以看成索引部分,结点中仅含有其子树(根节点)中的最大(或最小)关键字。
    例如下图所示为一棵3阶的B+树,通常在B+树上有两个头指针,一个指向根节点,一个指向关键字最小的叶子结点。因此,可以对B+树进行两种查找运算:一种是从最小关键字起顺序查找,另一种是从根节点开始,进行随机查找。

process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMjczNzk0,size_16,color_FFFFFF,t_70)
在B+树上进行查找,插入和删除和B-树类似。

只是在查找时,若非终端结点上的关键字等于给定值,并不终止,而是继续向下直到叶子结点。因此不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。

B+树的插入仅在叶子节点上进行,当结点中的关键字个数大于m时要分裂成两个结点,它们所含的关键字个数分别为a和a(a为不小于(m+1)/2的最小整数)。并且它们的双亲结点中应同时包含这两个结点的最大关键字。

B+树的删除也仅在叶子结点进行,当叶子结点中的最大关键字被删除时,其在非终端结点中的值可以作为一个“分界关键字”存在。若因删除而使结点中关键字个数少于b(b为不小于m/2的最小整数)时,其和兄弟结点的合并过程亦是和B-树类似。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BB-和B+都是一种平衡的多路查找,用于在磁盘等外部存储设备中进行高效的查找操作。 B是一种平衡的多路查找,每个节点可以存储多个数据,并且每个节点可以有多个子节点。B的每个节点存储了一定的范围区间,这样可以加快搜索速度。例如,对于1~100的索引值,B可以将其划分为多个区间,从而一次性排除大部分数据,使搜索更加高效。 B-是B的一种变体,它的每个节点可以存放多个数据和子节点,并且相邻的叶节点之间可以相互连接,这样可以增加区间访问性能,适用于范围查询等操作。 B+也是B的一种变体,与BB-不同的是,B+的叶子节点之间互相连接,而非叶子节点只存储索引信息,数据只存在于叶子节点中。这样可以提高区间查询的性能,并且也适用于范围查询等操作。 总结来说,BB-和B+都是一种平衡的多路查找,用于在磁盘等外部存储设备中进行高效的查找操作。它们的区别在于节点的存储方式和叶子节点的连接方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [B-、B和B+](https://blog.csdn.net/weixin_42386551/article/details/117604839)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [B-和B+的区别](https://blog.csdn.net/liuyuan1999/article/details/127382525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值