【数据结构与算法】B树与B+树
创始人
2024-03-21 01:13:01

🔥 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:数据结构与算法
🌠 首发时间:2022年12月6日
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
🌟 一以贯之的努力 不得懈怠的人生

阅读指南

  • B树
  • B树的插入
  • B树的删除
  • B+树
  • B树 VS B+树

B树

在这里插入图片描述

BBB 树,又称为多路平衡查找树,BBB 树中所有结点的孩子个数的最大值称为 BBB 树的阶,通常用 mmm 表示,上图即为 555 阶 BBB 树。一棵 mmm 阶 BBB 树或为空树,或为满足如下特性的 mmm 叉树:

  1. 树中每个结点至多有 mmm 棵子树,即至多含有 m−1m - 1m−1 个关键字

  2. 若根结点不是终端结点,则至少有两棵子树

  3. 除根结点外的所有非叶结点至少有 ⌈m/2⌉\lceil m/2 \rceil⌈m/2⌉ 棵子树,即至少含有 ⌈m/2⌉−1\lceil m/2 \rceil - 1⌈m/2⌉−1 个关键字

  4. 所有的叶结点都出现在同一层次上,并且不带信息(可以视为外部结点或类似于折半查找判定树的查找失败结点,实际上这些结点并不存在,指向这些结点的指针为空)

  5. 所有非叶结点的结构如下:
    在这里插入图片描述

    其中,Ki(i=1,2,...,n)K_i \ (i = 1, 2, ..., n)Ki​ (i=1,2,...,n) 为结点的关键字,且满足 K1

mmm 阶 BBB 树的核心特性:

  1. 根结点的子树数 ∈[2,m]\in [2, m]∈[2,m],关键字数 ∈[1,m−1]\in [1, m - 1]∈[1,m−1];其他结点的子树数 ∈[⌈m/2⌉,m]\in [\lceil m/2 \rceil, m]∈[⌈m/2⌉,m],关键字数 ∈[⌈m/2⌉−1,m−1]\in [\lceil m/2 \rceil -1, m - 1]∈[⌈m/2⌉−1,m−1]
  2. 对于任一结点,其所有子树的高度都相同
  3. 关键字的值:子树 0<0 <0< 关键字 1<1 <1< 子树 1<1 <1< 关键字 2<2 <2< 子树 2<2 <2< ......... (类比二叉查找树 左 <<< 中 <<< 右)

问:含 nnn 个关键字的 mmm 阶 BBB 数,最小高度和最大高度是多少?

最小高度 —— 让每个结点尽可能地满,每个结点都有 m−1m-1m−1 个关键字,mmm 个分叉,则可以得到公式 n≤(m−1)(1+m+m2+m3+...+mh−1=mh−1n \leq (m - 1)(1 + m + m^2 + m^3 + ... + m^{h - 1} = m^h - 1n≤(m−1)(1+m+m2+m3+...+mh−1=mh−1,因此 h≥logm(n+1)h \geq log_m(n + 1)h≥logm​(n+1)

最大高度 —— 让各层的分叉尽可能地少,即根结点只有 222 个分叉,其他结点只有 ⌈m/2⌉\lceil m/2 \rceil⌈m/2⌉ 个分叉,各层结点至少有:第一层 111、第二层 222、第三层 2⌈m/2⌉...2 \lceil m/2 \rceil ...2⌈m/2⌉... 第 hhh 层 2(⌈m/2⌉)h−22 (\lceil m/2 \rceil)^{h - 2}2(⌈m/2⌉)h−2,第 h+1h + 1h+1 层共有叶子结点(失败结点) 2(⌈m/2⌉)h−12 (\lceil m/2 \rceil)^{h - 1}2(⌈m/2⌉)h−1

nnn 个关键字的 BBB 树必有 n+1n + 1n+1 个叶子结点,则 n+1≥2(⌈m/2⌉)h−1n + 1 \geq 2 (\lceil m/2 \rceil)^{h - 1}n+1≥2(⌈m/2⌉)h−1,即 h≤log⌈m/2⌉n+12+1h \leq log_{\lceil m/2 \rceil} \frac{n + 1}{2} + 1h≤log⌈m/2⌉​2n+1​+1

我们可以用表格的形式更直观地来计算最大高度:

记 k=⌈m/2⌉k = \lceil m/2 \rceilk=⌈m/2⌉

层数最少结点数最少关键字数
第一层111111
第二层2222(k−1)2(k - 1)2(k−1)
第三层2k2k2k2k(k−1)2k(k - 1)2k(k−1)
第四层2k22k^22k22k2(k−1)2k^2(k - 1)2k2(k−1)
第 hhh 层2kh−22k^{h-2}2kh−22kh−2(k−1)2k^{h-2}(k - 1)2kh−2(k−1)

从表格中我们可以得到:hhh 层的 mmm 阶 BBB 树至少包含关键字总数 1+2(k−1)(k0+k1+k2+...+kh−2=1+2(kh−1−1)1 + 2(k -1)(k^0 + k^1 + k^2 + ... + k^{h - 2} = 1 + 2(k^{h - 1} - 1)1+2(k−1)(k0+k1+k2+...+kh−2=1+2(kh−1−1)

若关键字总数少于这个值,则高度一定小于 hhh,因此 n≥1+2(kh−1−1)n \geq 1 + 2(k^{h - 1} - 1)n≥1+2(kh−1−1),得:h≤logkn+12+1=log⌈m/2⌉n+12+1h \leq log_{k} \frac{n + 1}{2} + 1 = log_{\lceil m/2 \rceil} \frac{n + 1}{2} + 1h≤logk​2n+1​+1=log⌈m/2⌉​2n+1​+1

所以含 nnn 个关键字的 mmm 阶 BBB 数,logm(n+1)≤h≤log⌈m/2⌉n+12+1log_m(n + 1) \leq h \leq log_{\lceil m/2 \rceil} \frac{n + 1}{2} + 1logm​(n+1)≤h≤log⌈m/2⌉​2n+1​+1

B树的插入

核心要求:

  • 对于 mmm 阶 BBB 树 —— 除根结点外,结点关键字个数 ⌈m/2⌉−1≤n≤m−1\lceil m/2 \rceil - 1 \leq n \leq m- 1⌈m/2⌉−1≤n≤m−1
  • 子树 0<0 <0< 关键字 1<1 <1< 子树 1<1 <1< 关键字 2<2 <2< 子树 2<2 <2< .........

构建 BBB 树时,如果在插入新的关键字后,导致原结点的关键字数超过上限,则从中间位置(⌈m/2⌉\lceil m/2 \rceil⌈m/2⌉)将其中的关键字分为两部分,左部分包含的关键字放在原结点中,右部分包含的关键字放到新结点中,中间位置(⌈m/2⌉\lceil m/2 \rceil⌈m/2⌉)的结点插入原结点的父结点;若此时导致其父结点的关键字个数也超过了上限,则继续进行这种分裂操作,直至这个过程传到根结点为止,进而导致 BBB 树高度增 111

每次插入新元素一定是插入到最底层 “终端结点”,用 “查找” 来确定插入位置

B树的删除

① 若被删除的关键字在终端结点,则直接删除该关键字即可(注意结点关键字个数是否低于下限 ⌈m/2⌉−1\lceil m/2 \rceil - 1⌈m/2⌉−1

② 若被删除的关键字在非终端结点,则用直接前驱或直接后继来替代被删除的关键字

  • 直接前驱:当前关键字左侧指针所指子树中 “最右下” 的元素
  • 直接后继:当前关键字右侧指针所指子树中 “最左下” 的元素

所以对非终端结点关键字的删除必然可以转化为对终端结点的删除操作

③ 兄弟够借。若被删除的关键字所在结点删除前的关键字个数低于下限,且与此结点右(或左)兄弟结点的关键字个数还很宽裕,则需要调整该结点、右(或左)兄弟结点及其双亲结点(父子换位法)

④ 兄弟不够借。若被删除的关键字所在结点删除前的关键字个数低于下限,且此时与该结点相邻的左、右兄弟结点的关键字个数均 =⌈m/2⌉−1= \lceil m/2 \rceil - 1=⌈m/2⌉−1,则将关键字删除后与左(或右)兄弟结点及双亲结点中的关键字进行合并

在合并过程中,双亲结点中的关键字个数会减 111。若其双亲结点是根结点且关键字个数减少至 000(根结点关键字个数为 111 时,有 222 棵子树),则直接将根结点删除,合并后的新结点成为根;若双亲结点不是根结点,且关键字个数减少到 ⌈m/2⌉−2\lceil m/2 \rceil - 2⌈m/2⌉−2,则又要与它自己的兄弟结点进行调整或合并操作,并重复上述操作,直至符合 BBB 树的要求为止

B+树

在这里插入图片描述

上图是一棵 444 阶 B+B+B+ 树

一棵 mmm 阶 B+B+B+ 树需满足下列条件:

  1. 每个分支结点最多有 mmm 棵子树(孩子结点)
  2. 非叶根结点至少有两颗子树,其他每个分支结点至少有 ⌈m/2⌉\lceil m/2 \rceil⌈m/2⌉ 棵子树
  3. 结点的子树个数与关键字个数相等
  4. 所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排序,并且相邻叶结点按大小顺序相互连接起来
  5. 所有分支结点中仅包含它的各个子结点中关键字的最大值及指向其子结点的指针

B树 VS B+树

mmm 阶 BBB 树:

  • 结点中的 nnn 个关键字对应 n+1n + 1n+1 棵子树
  • 根结点的关键字数 n∈[1,m−1]n \in [1, m-1]n∈[1,m−1],其他结点的关键字数 n∈[⌈m/2⌉−1,m−1]n \in [\lceil m/2 \rceil - 1, m - 1]n∈[⌈m/2⌉−1,m−1]
  • 在 BBB 树中,各结点中包含的关键字是不重复的
  • BBB 树的结点中都包含了关键字对应的记录的存储地址

mmm 阶 B+B+B+ 树:

  • 结点中的 nnn 个关键字对应 nnn 棵子树
  • 根结点的关键字数 n∈[1,m]n \in [1, m]n∈[1,m],其他结点的关键字数 n∈[⌈m/2⌉,m]n \in [\lceil m/2 \rceil, m]n∈[⌈m/2⌉,m]
  • 在 B+B+B+ 树中,叶结点包含全部关键字,非叶结点中出现过的关键字也会出现在叶结点中
  • 在 B+B+B+ 树中,叶结点包含信息,所有非叶结点仅起索引作用,非叶结点中的每个索引项只含有对应子树的最大关键字和指向该子树的指针,不含有该关键字对应记录的存储地址

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...