数据结构复习指导之B树和B+树

目录

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-树”,注意这里的“-”是连接词,不能读作“减”。)是所有结点的平衡因子均等于0m路平衡查找树

命题追踪 ——B树的定义和特点(2009)】

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

1) 树中每个结点至多有m棵子树,即至多有m-1个关键字。

2) 若根结点不是叶结点,则至少有2棵子树,即至少有1个关键字。

3) 除根结点外的所有非叶结点至少有\left \lceil m/2 \right \rceil棵子树,即至少有\left \lceil m/2 \right \rceil-1个关键字。

4) 所有非叶结点的结构如下:

其中,Ki(i=1,2,.….n)为结点的关键字,且满足K1<K2<…<Kn;

Pi(i=0,1,…,n)为指向子树根结点的指针,且指针 P_{i-1}所指子树中所有结点的关键字均小于Ki,Pi所指子树中所有结点的关键字均大于Ki;

n(\left \lceil m/2 \right \rceil-1\leqslant n\leqslant m-1)为结点中关键字的个数。

5) 所有的叶结点(大多数教材将B树的叶结点定义为失败结点,而408真题中却常将B树的叶结点定义为最底层的终端结点。)都出现在同一层次上,并且不带信息(可以视为外部结点或类似于折半查找判定树的失败结点,实际上这些结点并不存在,指向这些结点的指针为空)。

命题追踪——B 树中关键字数和结点数的分析

图7.28所示为一棵5阶B树,可以借助该实例来分析上述性质:

1)结点的孩子个数等于该结点中关键字个数加1。

2)若根结点没有关键字就没有子树,则此时B树为空;

若根结点有关键字,则其子树个数必然大于或等于 2,因为子树个数等于关键字个数加1。

3)除根结点外的所有非叶结点至少有\left \lceil m/2 \right \rceil=\left \lceil 5/2 \right \rceil=3棵子树(即至少有\left \lceil m/2 \right \rceil-1=\left \lceil 5/2 \right \rceil-1=2个关键字);至多有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树中关键字的个数应满足

n\leqslant (m-1)(1+m+m^{2}+...+m^{h-1})=m^{h}-1,因此有h\geqslant log_{m}(n+1)

2)若让每个结点中的关键字个数达到最少,则容纳同样多关键字的 B树的高度达到最大

第一层至少有1个结点;

第二层至少有2个结点;

除根结点外的每个非叶结点至少有\left \lceil m/2 \right \rceil棵子树,则第三层至少有2\left \lceil m/2 \right \rceil个结点……第 h+1层至少有2(\left \lceil m/2 \right \rceil)^{h-1}个结点,注意到第h+1层是不包含任何信息的叶结点。

对于关键字个数为n的B树,叶结点即查找不成功的结点为n+1,由此有n+1\geqslant 2(\left \lceil m/2 \right \rceil)^{h-1},即 h\leqslant log_{\left \lceil m/2 \right \rceil}((n+1)/2)+1

例如,假设一棵3阶 B树共有8个关键字,则其高度范围为2<=h<=3.17,取整数。

1.3B树的插入

命题追踪——通过插入操作构造一棵初始为空的 B树

与二叉排序树的插入操作相比,B树的插入操作要复杂得多。在B树中查找到插入的位置后,并不能简单地将其添加到终端结点(最底层的非叶结点)中,因为此时可能会导致整棵树不再满足 B树定义中的要求。

将关键字 key 插入 B树的过程如下:

1) 定位

利用前述的 B树查找算法,找出插入该关键字的终端结点(在B树中查找 key 时,会找到表示查找失败的叶结点,因此插入位置一定是最底层的非叶结点)。

2) 插入

每个非根结点的关键字个数都在[\left \lceil m/2 \right \rceil-1,m-1]

若结点插入后的关键字个数小于 m,可以直接插入;

若结点插入后的关键字个数大于m-1,必须对结点进行分裂。

分裂的方法是:

取一个新结点,在插入 key后的原结点,

从中间位置(\left \lceil m/2 \right \rceil)将其中的关键字分为两部分,

左部分包含的关键字放在原结点中,

右部分包含的关键字放到新结点中,

中间位置(\left \lceil m/2 \right \rceil)的结点插入原结点的父结点。

若此时导致其父结点的关键字个数也超过了上限,则继续进行这种分裂操作,直至这个过程传到根结点为止,进而导致B树高度增1。

对于m=3的B树,所有结点中最多有m-1=2个关键字,若某结点中已有两个关键字,则结点已满,如图 7.29(a)所示。

插入一个关键字 60 后,结点内的关键字个数超过了 m-1,如图 7.29(b)所示,此时必须进行结点分裂,分裂的结果如图 7.29(c)所示。

1.4B树的删除

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

命题追踪——B 树的删除操作的实例(2012,2022)】

当被删关键字k不在终端结点中时,可以用k的前驱(或后继)k',

即k的左侧子树中“最右下”的元素(或右侧子树中“最左下”的元素),来替代k,

然后在相应的结点中删除k',关键字k'必定落在某个终端结点中,则转换成了被删关键字在终端结点中的情形。

在图7.30的4阶B树中,删除关键字 80,用其前驱 78 替代,然后在终端结点中删除 78。

因此只需讨论被删关键字在终端结点中的情形,有下列三种情况:

1)直接删除关键字

若被删关键字所在结点删除前的关键字个数\geqslant \left \lceil m/2 \right \rceil,表明删除该关键字后仍满足B树的定义,则直接删去该关键字。

2)兄弟够借

若被删关键字所在结点删除前的关键字个数=\left \lceil m/2 \right \rceil-1,且与该结点相邻的右(或左)兄弟结点的关键字个数\geqslant \left \lceil m/2 \right \rceil,则需要调整该结点、右(或左)兄弟结点及其双
亲结点(父子换位法),以达到新的平衡。

在图 7.31(a)中删除 4阶 B树的关键字 65,右兄弟关键字个数\geqslant \left \lceil m/2 \right \rceil=2,将 71 取代原 65 的位置,将 74 调整到 71 的位置。

3)兄弟不够借

若被删关键字所在结点删除前的关键字个数= \left \lceil m/2 \right \rceil-1,且此时与该结点相邻的左、右兄弟结点的关键字个数都= \left \lceil m/2 \right \rceil-1,则将关键字删除后与左(或右)兄弟结
点及双亲结点中的关键字进行合并。

在图 7.31(b)中删除4阶 B树的关键字 5,它及其右兄弟结点的关键字个数= \left \lceil m/2 \right \rceil-1=1,所以在5删除后将 60 合并到 65 结点中。

命题追踪——非空B树的查找、插入、删除操作的特点

在合并过程中,双亲结点中的关键字个数会减1。

若其双亲结点是根结点且关键字个数减少至 0(根结点关键字个数为1时,有2棵子树),则直接将根结点删除,合并后的新结点成为根;

若双亲结点不是根结点,且关键字个数减少到\left \lceil m/2 \right \rceil-2,则又要与它自己的兄弟结点进行调整或合并操作,并重复上述步骤,直至符合B树的要求为止。

2.B+树的基本概念

命题追踪——B+树的应用场合(2017)】

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

一棵 m 阶 B+树应满足下列条件:

1)每个分支结点最多有m棵子树(孩子结点)。

2)非叶根结点至少有两棵子树,其他每个分支结点至少有\left \lceil m/2 \right \rceil棵子树。

3)结点的子树个数与关键字个数相等。

4)所有叶结点包含全部关键字及指向相应记录的指针,叶结点中将关键字按大小顺序排列,并且相邻叶结点按大小顺序相互链接起来(支持顺序查找)。

5)所有分支结点(可视为索引的索引)中仅包含它的各个子结点(即下一级的索引块)中关键字的最大值及指向其子结点的指针。

命题追踪——B 树和 B+树的差异的分析(2016)】

m阶B+树与m阶B树的主要差异如下:

1)在 B+树中,具有n个关键字的结点只含有n棵子树,即每个关键字对应一棵子树;

而在B树中,具有n个关键字的结点含有n+1棵子树。

2)在 B+树中,每个结点(非根内部结点)的关键字个数n的范围是\left \lceil m/2 \right \rceil\leqslant n\leqslant m(非叶根结点:2≤n≤m);

而在B树中,每个结点(非根内部结点)的关键字个数n的范围是\left \lceil m/2 \right \rceil -1\leqslant n\leqslant m-1(根结点:1≤n≤m-1)。

3)在 B+树中,叶结点包含了全部关键字,非叶结点中出现的关键字也会出现在叶结点中;

而在B树中,最外层的终端结点包含的关键字和其他结点包含的关键字是不重复的。

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

这样能使一个磁盘块存储更多的关键字,使得磁盘读/写次数更少,查找速度更快。

5)在 B+树中,用一个指针指向关键字最小的叶结点,将所有叶结点串成一个线性链表。

图 7.32 所示为一棵4阶 B+树。可以看出,分支结点的关键字是其子树中最大关键字的副本。

通常在 B+树中有两个头指针:一个指向根结点,另一个指向关键字最小的叶结点。

因此,可以对 B+树进行两种查找运算:

  • 一种是从最小关键字开始的顺序查找,
  • 另一种是从根结点开始的多路查找。

B+树的查找、插入和删除操作和 B树的基本类似。

只是在查找过程中,非叶结点上的关键字值等于给定值时并不终止,而是继续向下查找,直到叶结点上的该关键字为止。

所以,在B+树中查找时,无论查找成功与否,每次查找都是一条从根结点到叶结点的路径

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/658865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

超声波清洗机哪家好用又实惠?四款好评如潮的超声波清洗机推荐

很多戴眼镜的朋友都在寻求一种既能保护眼镜光泽又能深层清洁的方法时&#xff0c;超声波清洗机无疑成为了许多眼镜用户的首选&#xff0c;可以更好清洗眼镜&#xff0c;从而避免眼镜的污渍而导致我们眼部出现过敏的问题。但在市场上琳琅满目的超声波清洗机中&#xff0c;哪些才…

[pdf,epub]《软件方法》2024版电子书共290页(202405更新)

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 已上传本账号CSDN资源。 或者到以下链接下载&#xff1a; http://www.umlchina.com/url/softmeth2024.html&#xff0c;或点击“阅读原文”。 如果需要提取码&#xff1a;umlc 已排…

「浏览器」跨站请求伪造CSRF攻击的原理以及防范措施

前言 HTTP 是一个无状态的协议&#xff0c;比如需要账号密码登录的网站这个场景&#xff0c;为了避免每次都需要重复输入&#xff0c;有一种方案就是Cookie&#xff0c;具体使用不做赘述&#xff0c;但是这样带来了一些安全问题。跨站请求伪造&#xff08;CSRF&#xff09;攻击…

IMU应用于评估脊髓损伤患者的膝关节痉挛

近日&#xff0c;美国西北大学团队利用便携式IMU系统精确量化脊髓损伤&#xff08;SCI&#xff09;患者膝关节伸肌痉挛的程度&#xff0c;不仅验证了IMU系统的可靠性与准确性&#xff0c;还强调了其在动态评估痉挛变化方面的独特贡献。 研究团队创新性地将IMU技术引入到经典的…

视频智能分析平台LntonAIServer视频监控管理平台裸土检测算法的重要性与应用

随着科技的飞速发展&#xff0c;人工智能技术在各个领域的应用越来越广泛。其中&#xff0c;LntonAIServer裸土检测算法作为一种先进的技术手段&#xff0c;已经在农业、环境保护等领域取得了显著的成果。本文将探讨LntonAIServer裸土检测算法的重要性及其在实际应用中的优势。…

Web前端复习二(期末考试考到了一部分)

第一章测试 选项中加粗的为答案 1.图片的边框可以通过( )设定宽度。 A.width B.height C.border D.align 2.关于超链接&#xff0c;( )属性用于规定在何处打开链接文档。 A.href . B.target C.title D.onclick 3.( )是在新窗口打开网页文档。 A _blank B_self C_…

宏基因组+代谢之后,还能做点啥?

近期&#xff0c;发表在《Cell Host & Microbe》IF30.3上的论文将微生物基因与血浆和粪便代谢物联系起来&#xff0c;揭示了溃疡性结肠炎病程中的宿主-微生物相互作用。 文章内容要点 该研究整合了多组学方法&#xff0c;以识别与炎症疾病相关的微生物及其产物。 研究使用…

ios 端如何免费使用Emby???(利用Quantumult X )

本文转自博主的个人博客&#xff1a;https://blog.zhumengmeng.work,欢迎大家前往查看。 原文链接&#xff1a;点我访问 注意&#xff1a;使用此激活方式&#xff0c;有唯一缺点&#xff0c;在观看Emby时需保持Quantumult X为开启状态&#xff01; 一、安装证书 开启 MitM 后…

【病毒分析】Babuk勒索家族babyk后缀系列分析--Windows篇

1.背景 1.1 Babuk勒索家族 Babuk勒索家族最早曝光于2021年1月初&#xff0c;在几个月内&#xff0c;它就跻身于最臭名昭著的勒索软件组织之列。自回归以来&#xff0c;它通过在地下论坛上积极宣传自己而获得了更多的知名度。在策略方面&#xff0c;其加密功能与其他勒索软件组…

【Python】 如何获取Python模块的路径?

基本原理 在Python中&#xff0c;模块是组织代码的一种方式&#xff0c;每个.py文件都是一个模块。有时&#xff0c;我们需要获取一个模块的路径&#xff0c;这在需要定位模块文件、读取模块配置文件或动态加载模块时非常有用。Python提供了几种方法来获取模块的路径。 代码示…

Java基础入门day60

day60 购物车案例补充 设置欢迎页 打开也系统&#xff0c;就可以直接看到商品列表页面 之前曾经设置过欢迎页&#xff0c;都是针对页面&#xff0c;可以有html页面&#xff0c;也可以有jsp页面 但是今天我们将一个servlet设置成欢迎页 在web.xml文件中设置欢迎页 <welcome…

我国赤泥年产量庞大 政策引导下赤泥绿色利用率将不断提升

我国赤泥年产量庞大 政策引导下赤泥绿色利用率将不断提升 赤泥是指从铝土矿中提炼氧化铝后产生的强碱性工业固体废渣&#xff0c;由于含大量氧化铁&#xff0c;表面呈现红色&#xff0c;而得名赤泥。   赤泥通常包含氧化铝、氧化铁、二氧化硅、氧化钙、碱金属及其他微量元素&…

【Jmeter】性能测试之压测脚本生成,也可以录制接口自动化测试场景

准备工作-10分中药录制HTTPS脚本&#xff0c;需配置证书 准备工作-10分中药 以https://www.baidu.com/这个地址为录制脚本的示例。 录制脚本前的准备工作当然是得先把Jmeter下载安装好、JDK环境配置好、打开Jmeter.bat&#xff0c;打开cmd&#xff0c;输入ipconfig&#xff0c;…

数据分析中的列与行交换技巧

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;数据交换的重要性 二、列交换的基本原理 三、列交换的代码实现 1. 使…

勒索软件统计数据揭示了网络勒索的惊人速度

本文通过各种报告摘录&#xff0c;提供了有关当前勒索软件形势的统计数据和见解。 全球勒索病毒危机加剧 NTT安全控股《2024全球威胁情报报告》&#xff08;2024年5月&#xff09; 据NTT安全控股公司的《2024年全球威胁情报报告》显示&#xff0c;勒索软件和勒索事件在2023年激…

无人售货机零售业务成功指南:从市场分析到创新策略

在科技驱动的零售新时代&#xff0c;无人售货机作为一种便捷购物解决方案&#xff0c;正逐步兴起&#xff0c;它不仅优化了消费者体验&#xff0c;还显著降低了人力成本&#xff0c;提升了运营效能。开展这项业务前&#xff0c;深入的市场剖析不可或缺&#xff0c;需聚焦消费者…

Ai绘画怎么正确使用关键词?

在AI绘画的过程中&#xff0c;关键词&#xff08;提示词&#xff09;是非常重要的组成部分&#xff0c;下面我以AI绘画常用的Stable Diffusion为例&#xff0c;来介绍下AI绘画怎么使用提示词吧&#xff01; 一、提示词是什么 提示词&#xff08;Prompt&#xff09;就是我们对…

开源数据库同步工具DBSyncer

前言&#xff1a; 这么实用的工具&#xff0c;竟然今天才发现&#xff0c;相见恨晚呀&#xff01;&#xff01;&#xff01;&#xff01; DBSyncer&#xff08;英[dbsɪŋkɜː]&#xff0c;美[dbsɪŋkɜː 简称dbs&#xff09;是一款开源的数据同步中间件&#xff0c;提供M…

北美互联网裁员太狠了,程序员“做管理上岸”越来越难

北美互联网现在裁员太狠了&#xff0c;“做管理上岸”这种事情在现在这种行业形势已经基本不存在了&#xff0c;这个人管理40人的团队该裁还是裁。 然而硅谷还是中国程序员心中的圣地&#xff08;华子一定程度上也是很多人的心之所向&#xff0c;技术大厂捞人&#xff0c;前后…

【C语言每日一练】【第1天】C程序实现分数计算器

一、实现目标 输入两个分数&#xff0c;中间是四则运算符&#xff08;&#xff0c;-&#xff0c;*&#xff0c;/&#xff09;&#xff0c;程序输出分数形式的运算结果。 样例输入&#xff1a;1,2,,1,3 样例输出&#xff1a;5/6 (1/21/3) 二、实现步骤 1、求最大公约数 定义一…