数据结构复习指导之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+树中查找时,无论查找成功与否,每次查找都是一条从根结点到叶结点的路径

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于51单片机数字频率计的设计

本文提出设计数字频率计的方案,重点介绍以单片机AT89C51为控制核心,实现频率测量的数字频率设计。测频的基本原理是采用在低频段直接测频法,在低频段直接测频法的设计思路,硬件部分由单片机和数计显示电路组成;软件部分由信号频率测量模块和数据显示模块等模块实现。应用单…

Raven2掠夺者2渡鸦2账号需要验证怎么解决 超简单验证账号教程

《渡鸦2》是一款源自韩国的创新力作&#xff0c;作为《Raven》系列的最新续篇&#xff0c;这款游戏在MMORPG手游领域内再度扩展了其标志性的暗黑奇幻宇宙&#xff0c;融入了大量革新的游戏设计与丰富内容。定档于2024年5月29日开启公测的《渡鸦2》&#xff0c;正处在紧张刺激的…

美光拟投巨资在日本广岛建DRAM厂,目标2027年底投产

美光科技&#xff08;Micron Technology&#xff09;据日本媒体报道&#xff0c;计划在日本广岛县新建一座DRAM芯片生产工厂&#xff0c;目标最快于2027年底投入运营。这一举措标志着美光在增强其内存芯片生产能力方面的又一重大步伐。 报道称&#xff0c;新工厂的总投资规模预…

Kotlin核心编程知识点-03-类型系统

文章目录 1.null 引用2.可空类型2.1.安全的调用 ?.2.2.Elvis 操作符 ?:2.3.非空断言 !!.2.4.类型检查2.5.类型智能转换 3.比 Java 更面向对象的设计3.1.Any&#xff1a;非空类型的根类型3.2.Any?: 所有类型的根类型3.3.自动装箱和拆箱3.4.数组类型 4.泛型&#xff1a;让类型…

CVPR2024《RMT: Retentive Networks Meet Vision Transformers》论文阅读笔记

论文链接&#xff1a;https://arxiv.org/pdf/2309.11523 代码链接&#xff1a;https://github.com/qhfan/RMT 引言 ViT近年来在计算机视觉领域受到了越来越多的关注。然而&#xff0c;作为ViT的核心模块--自注意力缺乏空间先验知识。此外&#xff0c;自注意力的二次计算复杂度…

Spring和Servlet的整合

Servlet对象是谁创建的&#xff1f; 由服务器端创建的 程序启动调用加载spring配置文件代码 Web应用程序启动也需要加载Spring配置文件 Web开发中有三大组件&#xff1a; 1、servlet 2、filter 3、listener&#xff08;request&#xff0c;session&#xff0c;application&…

如何确保大模型 RAG 生成的信息是基于可靠的数据源?

在不断发展的人工智能 (AI) 领域中&#xff0c;检索增强生成 (RAG) 已成为一种强大的技术。 RAG 弥合了大型语言模型 (LLM) 与外部知识源之间的差距&#xff0c;使 AI 系统能够提供更全面和信息丰富的响应。然而&#xff0c;一个关键因素有时会缺失——透明性。 我们如何能够…

LabVIEW软件需求分析文档内容和编写指南

编写LabVIEW软件需求分析文档&#xff08;Software Requirements Specification, SRS&#xff09;是软件开发的关键步骤之一。以下是详细的内容结构、编写指南和注意事项&#xff1a; 内容结构 引言 项目背景&#xff1a;简要介绍项目背景和目的。 文档目的&#xff1a;说明需…

Java基础:类的详细说明

Java是一门面向对象的编程语言&#xff0c;所谓的面向对象&#xff0c;简单的说&#xff0c;就是在软件开发过程中&#xff0c;用各种各样的对象实现所需功能。 对象就好像是现实世界中不计其数的物体&#xff0c;根据物体的性质可以将其进行分门别类&#xff1a;石头、锤子、…

服务案例|网络攻击事件的排查与修复

LinkSLA智能运维管家V6.0版支持通过SNMP Trap对设备进行监控告警&#xff0c;Trap是一种主动推送网络设备事件或告警消息的方式&#xff0c;与SNMP轮询&#xff08;polling&#xff09;不同&#xff0c;具有以下几点优势&#xff1a; 1. 实时监控与快速响应 SNMP Trap能够实时…

如何在操作系统中合并 PDF 文件?不同系统有不同的方法

Windows 系统 在 Windows 系统中想要合并 PDF 文件我们可能需要借助一些第三方的软件或者浏览器的插件。 我们可以在 Google 浏览器中的 Chrome 应用商店中输入“Merge pdf”这样就可以搜索到在线合并 PDF 文件的插件&#xff0c;只需要下载到浏览器中就可以直接使用。当然 Ed…

【Unity Shader入门精要 第11章】让画面动起来(二)

1. 顶点动画的原理 顶点动画的原理是&#xff0c;在顶点着色器中按照一定的规则或函数计算得到一段偏移量对顶点进行移动&#xff0c;最后将改变位置后的顶点变换到裁剪空间进行后续的渲染工作。 可见&#xff0c;与纹理动画只是改变从纹理中哪一部分开始显示图案不同&#x…

visual studis 安装教程

1、下载软件 2、直接安装。根据自己的需求选择需要的模板类型。 如果是.net环境&#xff0c;可以选择.net项目&#xff1b; 如果是c环境&#xff0c;可以选择c项目模板&#xff0c;多个模板可以同时并存。 3、选择C模板&#xff0c;然后重新启动项目。 我是小路&#xff0c;一枚…

使用小猪APP分发打造高效的App封装工具

你是否曾经因为App封装和分发的复杂性而头疼不已&#xff1f;在这个移动应用迅速发展的时代&#xff0c;开发人员不仅需要专注于应用的功能和用户体验&#xff0c;还必须面对繁琐的封装和分发过程。幸运的是&#xff0c;小猪APP分发www.appzhu.cn正好为我们提供了一个简便而高效…

手绘任意波

更多内容&#xff0c;请访问我的网站&#xff1a;https://jiangge12.github.io/ 上位机发送手绘波形数据&#xff0c;下位机接收并输出。 支持 STM32 STC arduino Pico 等多种单片机&#xff0c;内置或外置 DAC 实现。

【学习Day1】计算机基础

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 1.1 中央处理单元CPU 中央处理器&#xff08;CPU&#xff0c;central processing unit&…

在全志H616核桃派开发板上进行音频配置的方法详解

耳机口​ 核桃派板载的3.5mm音频输出口&#xff0c;该接口有一定的输出功率&#xff0c;可以使用耳机或者带功放的扬声器都可以播放声音。 查看音频设备​ 可以使用下面指令来查看音频信息&#xff1a; aplay -l音频播放测试​ 播放系统自带wav音频文件测试, 下面指令的au…

控制台生产厂家生产流程详解

控制台生产厂家的生产流程是一个复杂而精细的过程&#xff0c;它涉及多个环节&#xff0c;从原材料的准备到最终产品的出厂检验&#xff0c;每一步都至关重要。以下是控制台生产厂家的一般生产流程&#xff1a; 厂家会根据客户的需求和市场趋势进行产品设计。设计师会综合考虑控…

闪电加载:Hexo博客性能优化全攻略

巴索罗缪大熊 前言 这些年积累了很多前端性能优化的知识点和思路&#xff0c;日常工作很少涉及技术层极限优化&#xff0c;近期终于一点点把博客独立搭建并部署了&#xff0c;对之前的一些技术点进行了深度探索&#xff0c;最终结果也达到了预期效果&#xff0c;由于水平有限&…

河北奥润顺达集团研究院PMO经理常江南受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 河北奥润顺达集团研究院PMO经理、研发部运营管理办负责人常江南先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“初建PMO的体系宣贯和人员培养实践总结”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xf…