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

news2024/11/16 22:22:41

目录

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.coloradmin.cn/o/1712671.html

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

相关文章

我觉得 “砍需求” 是程序员最牛逼的本领

在下认为&#xff0c;不会 “砍需求” 的程序员不是好程序员&#xff0c;工作经验越丰富的程序员&#xff0c;砍需求的本领一般就越高。即使现在我多了一个身份 —— 管理团队&#xff0c;我也会帮开发同学去跟产品砍需求。 没错&#xff0c;从管理者的角度&#xff0c;我希望…

7 步解决Android Studio模拟器切换中文输入

详细步骤传送地址&#xff1a;Android Studio 模拟器切换中文输入 目录 01 问题概述 02 模拟器的调试 01 问题概述 大家在使用Android Studio 软件进行项目演示时总会遇到一些输入框需要输入中文汉字的情况&#xff0c;由于AS自带的模拟器基本都是英文&#xff0c;这时就有同…

【网络原理】HTTPS详解

一.HTTPS的相关基本概念 HTTPS:由于HTTP协议内容都是按照文本的方式明文传输的. 这就导致在传输过程中出现一些被篡改的情况. 可能会出现运营商劫持,黑客入侵等不利影响, 因此就引入了HTTPS,其本质上就是在HTTP协议的基础上,引入了一个加密层SSM.什么是运营商劫持? 例如我们要…

UI线程和工作线程

引用&#xff1a;windows程序员面试指南 工作线程 只处理逻辑的线程&#xff0c;例如&#xff1a;启动一个线程&#xff0c;用来做一个复杂的计算&#xff0c;计算完成之后&#xff0c;此线程就自动退出&#xff0c;这种线程称为工作线程 UI线程 Windows应用程序一般由窗口…

CIM分级

定义 以建筑信息模型&#xff08;BIM&#xff09;、地理信息系统&#xff08;GIS&#xff09;、物联网&#xff08;IoT&#xff09;等技术为基础&#xff0c;整合城市地上地下、室内室外、历史现状未来多维多尺度信息模型数据和城市感知数据&#xff0c;构建起三维数字空间的城…

护网在即,请拿你走你的蓝队神器!~

前言 养兵千日用兵一时&#xff0c;护网已经临近了&#xff0c;你是不是还在考虑现场一系列可能发生的情况&#xff1f;提前找好工具,避免在甲方面前太尴尬? 你需要它&#xff01; 据我了解&#xff0c;去年国护的时候就已经有不少攻城狮在使用我们的蓝队应急响应工具箱&am…

设计模式——工厂三兄弟之工厂方法

1.业务需求 ​ 大家好&#xff0c;我是菠菜啊。在介绍这期工厂方法模式前&#xff0c;我们先来看看这样的需求&#xff1a;升级之前的计算器&#xff0c;增加对数和指数运算。&#xff08;看这篇文章前可以先回顾《设计模式——工厂三兄弟之简单工厂》这篇&#xff09; 2.初…

Comfyui导出图片的命名技巧,日期文件夹

种子序号命名&#xff1a;%KSampler.seed% 图片宽高序号命名&#xff1a;%Empty Latent Image.width%x%Empty Latent Image.height% 年月日&#xff1a;%date:yyyy-MM-dd% 时分秒&#xff1a;%date:hhmmss% 年月日种子序号&#xff1a;%date:yyyy-MM-dd%/%KSampler.seed%

「清新题精讲」CF260E - Dividing Kingdom

CF260E - Dividing Kingdom D e s c r i p t i o n \mathrm{Description} Description 给定 n n n 个点 ( x i , y i ) (x_i,y_i) (xi​,yi​) 和长度为 9 9 9 的数列 a a a&#xff0c;满足 ∑ i 1 n a i n \sum_{i1}^na_in ∑i1n​ai​n。通过 2 2 2 条平行于 x x …

Mac连接虚拟机(Linux系统)

1.确定虚拟机的IP地址 ifconfig //终端命令&#xff0c;查询ip地址 sudo apt install net-tools 安装完成后再次执行 ifconfig&#xff1a; 2.安装SSH&#xff08;加密远程登录协议&#xff09; (1).安装OpenSSH服务器软件包&#xff1a; sudo apt-get install openssh-ser…

leetCode.86. 分隔链表

leetCode.86. 分隔链表 题目思路&#xff1a; 代码 class Solution { public:ListNode* partition(ListNode* head, int x) {auto lh new ListNode(-1), rh new ListNode(-1);auto lt lh, rt rh;for(auto p head; p; p p->next ) {if(p->val < x) {lt lt->…

33 mid 55. 跳跃游戏

贪心算法&#xff1a; class Solution {public boolean canJump(int[] nums) {int leftBorder 0;for (int i 0; i <nums.length; i) {if(i<leftBorder){leftBorderMath.max(leftBorder,inums[i]);}if(leftBorder>nums.length-1){return true;}}return false;} }

精酿啤酒:品质与口感对啤酒消费趋势的影响

随着消费市场的不断变化&#xff0c;啤酒消费趋势也在发生着演变。在这个过程中&#xff0c;品质与口感成为了影响啤酒消费趋势的重要因素。对于Fendi club啤酒而言&#xff0c;其卓着的品质和与众不同的口感对啤酒消费趋势产生了深远的影响。 品质的提升是推动啤酒消费趋势发展…

fastadmin部署后JSHint报错,导致Config::getValueByName()无法获取到值

问题 解决方案 一、本地 在phpstorm中&#xff0c;依次点击【设置】-【JSHint】-【取消勾选Enable】-【应用】即可。

Neural Filters:深度模糊

Ps菜单&#xff1a;滤镜/Neural Filters/摄影/深度模糊 Neural Filters/PHOTOGRAPHY/Depth Blur 深度模糊 Depth Blur滤镜可以在图像中创建环境深度以提供前景或背景对象。 “深度模糊”滤镜利用 AI 技术&#xff0c;分析图像的深度信息&#xff0c;生成一个深度图&#xff0c;…

爬虫案例-亚马逊反爬分析-验证码突破(x-amz-captcha)

总体概览&#xff1a;核心主要是需要突破该网站的验证码&#xff0c;成功后会返回我们需要的参数后再去请求一个中间页&#xff08;类似在后台注册一个session&#xff09;&#xff0c;最后需要注意一下 IP 是不能随意切换的 主要难点&#xff1a; 1、梳理整体反爬流程 2、验证…

【JavaScript】ECMAS6(ES6)新特性概览(二):解构赋值、扩展与收集、class类全面解析

&#x1f525; 个人主页&#xff1a;空白诗 &#x1f525; 热门专栏&#xff1a;【JavaScript】 文章目录 &#x1f33f; 引言五、 Destructuring Assignment - 解构赋值&#xff0c;数据提取的艺术 &#x1f3a8;&#x1f4cc; 数组解构&#x1f4cc; 对象解构&#x1f4cc; 特…

iOS自动连接已知Wi-Fi功能的实现

首先需要在配置文件申请的时候将hotspot勾选上&#xff0c;之后还要在x-code里添加对应的配置&#xff0c;由于我们并没有用到获取设备周边Wi-Fi的功能&#xff0c;所以就没申请相关权限 相关连接Wi-Fi代码如下&#xff1a; #import <NetworkExtension/NetworkExtension.h&…

LeetCode583:两个字符串的删除操作

题目描述 给定两个单词 word1 和 word2 &#xff0c;返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 代码 解法1 /*dp[i][j]&#xff1a;以i-1为结尾的wrod1中有以j-1为尾的word2的个数为了让word1和word2相同&#xff0c;最少操作…

排序专题(常见8种)【思路解析和代码实现】【2w字长文】

排序专题&#xff08;常见8种&#xff09; 1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中…