【B树、B-树、B+、B*树】

目录

  • 一、B-树(即B树)的定义及操作
    • 1.1、定义
    • 1.2、操作
      • 1.2.1、查找
      • 1.2.2、插入
      • 1.2.3、删除
  • 二、B+树的定义及操作
    • 2.1、定义
    • 2.2、操作
      • 2.2.1、查找
      • 2.2.2、插入
      • 2.2.3、删除
  • 三、B*树

一、B-树(即B树)的定义及操作

1.1、定义

B-tree即B树,B是Balanced,平衡的意思,因为B树的原英文名称为B-tree,国内很多人将其译为B-tree,所以B树就是B-树。

磁盘管理系统中的目录管理,以及数据库系统中的索引组织多数都采用B树这种数据结构。

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

  1. 树中每个结点至多有m棵子树;
  2. 若根结点不是叶子结点,则至少有两棵子树;
  3. 除根之外的所有非终端结点至少有[m/2](向上取整)棵子树;
  4. 所有叶子结点都出现在同一层次上,并且不带信息,通常称为失败结点(失败结点并不存在,指向这些结点的指针为空,引入失败结点是为了便于分析B树的查找性能);
  5. 所有非终端结点最少有[m/2]-1个关键字,最多有m-1个关键字,结点的结构如图所示:
    在这里插入图片描述
    其中,n为结点中关键字的个数,K为关键字,且在这里插入图片描述;P为指向子树根结点的指针,且指针在这里插入图片描述所指子树中所有结点的关键字均小于在这里插入图片描述在这里插入图片描述所指子树中所有结点的关键字均大于在这里插入图片描述
    对任一关键字K而言,在这里插入图片描述相当于指向其左子树,在这里插入图片描述相当于指向其右子树。
    B树具有平衡、有序、多路的特点。
    在这里插入图片描述
    具体实现时,为记录其双亲结点,B树结点的存储结构通常会增加一个parent指针,指向其双亲结点,如图:
    在这里插入图片描述
#define MaxSize 3typedef struct BTnode{int keynum;//结点中关键字的个数,即结点的大小struct BTnode *parent;//指向双亲结点ElemType key[m+1];//关键字向量,0号单元未用struct BTnode *ptr[m+1];//子树指针向量Record *recptr[m+1];//记录指针向量,0号单元未用
}BTnode, *BTree;//B树查找结果类型
typedef struct{BTnode *pt;int i;//1...m,在结点中的关键字序号int tag;//1:查找成功,0:查找失败
}Result;

1.2、操作

1.2.1、查找

算法思想:
将给定值key与根结点的各个关键字进行比较,由于该关键字序列是有序的,所以查找时可采用顺序查找,也可采用折半查找,查找时:

  1. 在这里插入图片描述,则查找成功;
  2. 在这里插入图片描述,则顺着指针在这里插入图片描述所指向的子树继续向下查找;
  3. 在这里插入图片描述,则顺着指针在这里插入图片描述所指向的子树继续向下查找;
  4. 在这里插入图片描述,则顺着指针在这里插入图片描述所指向的子树继续向下查找。
  5. 如果在自上而下的查找过程中,找到了关键字key,则查找成功,如果直到叶子结点也未找到,则查找失败。

1.2.2、插入

思想:针对m阶高度h的B树,插入一个元素时,首先在B树中是否存在,如果不存在,即在叶子结点处结束,然后在叶子结点中插入该新的元素。

  1. 若该结点元素个数小于m-1,则直接插入;
  2. 若该结点元素个数等于m-1,引起结点分裂,以该结点中间元素为分界,取中间元素(若中间元素为两个,则随机选取一个)插入到父结点中;
  3. 重复上述操作,直到所有结点符合B树的规则,最坏的情况是一直分裂到根结点,生成新的根结点,高度增加1。

示例分析:
以5阶B树为例,5阶B树的规则:

  1. 2<=根结点的子树<=5;
  2. 3<=分支结点的子树<=5
  3. 1<=根结点元素个数<=4
  4. 2<=分支结点元素个数<=4
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.2.3、删除

首先查找B树中需删除的元素,如果该元素在B树中存在,则将该元素在其结点中进行删除;删除该元素后,首先判断该元素是否有左右孩子结点,如果有,则上移孩子结点中的某相近元素(“左孩子最右边的节点”或“右孩子最左边的节点”)到父节点中,然后是移动之后的情况;如果没有,直接删除。

  1. 某结点中元素数目小于[m/2]-1,则需要看其某相邻兄弟结点是否丰满;
  2. 如果丰满(结点中元素个数大于(m/2)-1),则向父节点借一个元素来满足条件;
  3. 如果其相邻兄弟都不丰满,即其结点数目等于(m/2)-1,则该结点与其相邻的某一兄弟结点进行“合并”成一个结点;
    以5阶B树为例,详细讲解删除的动作:
    如图依次删除依次删除【8】,【20】,【18】,【5】
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

二、B+树的定义及操作

2.1、定义

B+树是应文件系统所需而产生的B树的变形树。
一棵m阶B+树满足以下条件:

  1. 每个结点最多有M个子结点;
  2. 非叶子结点的根结点至少有两个子结点;
  3. 除根结点外的分支结点至少有[m/2]个子结点;
  4. 有k棵子树的非叶子结点有k个关键字,且关键字按照升序排列;
  5. 叶结点在同一层次中。
  6. 所有叶子结点增加一个链接指针链接在一起;
  7. 所有关键字及其映射数据都在叶子结点中出现。
    在这里插入图片描述
    在这里插入图片描述
    优点:
    B+树的插入过程与B树基本类似,区别在于:
  8. 第一次插入两层结点,一层做分支,一层做根;
  9. B+树在分裂时,是将左半部分的数据保留,右半部分的数据放入新建兄弟结点中,并将新建结点中的最小值更新到父结点中。

2.2、操作

2.2.1、查找

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

B+树不仅能够有效地查找单个关键字,而且更适合查找某个范围内的所有关键字。例如,在B+树上找出范围在[a, b]之间的所有关键字值。 处理方法如下:通过一次查找找出关键字 a, 不管它是否存在,都可以到达可能出现a的叶子结点,然后在叶子结点中查找关键字值等于a或大于a的那些关键字,对千所找到的每个关键字都有一个指针指向相应的记录,这些记录的关键字在所需要的范围。 如果在当前结点中没有发现大于b的关键字,就可以使用当前叶子结点的最后一个指针找到下一个叶子结点,并继续进行同样的处理,直至在某个叶子结点中找到大于b的关键字,才停止查找。

2.2.2、插入

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

2.2.3、删除

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

三、B*树

B*树是在B+树的基础上,在B+树的非根和非叶子结点增加指向兄弟的指针,将结点的利用率从1/2提高到2/3。
在这里插入图片描述

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

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

相关文章

18_Shell好用工具:sort

18_Shell好用工具&#xff1a;sort 选项说明-k指定要排序的列-nnumber&#xff0c;按照数值大小排序-rreverse&#xff0c;逆序-t分隔符-u去重-o保存排序到文件 一、数字升序 #sort1.txt文件纯数字 #升序 sort -n sort1.txt #降序 sort -nr sort1.txt二、数字升序去重 #数字…

框架设计MVC

重点&#xff1a; 1.用户通过界面操作&#xff0c;传输到control&#xff0c;control可以直接去处理View&#xff0c;或者通过模型处理业务逻辑&#xff0c;然后将数据传输给view。 2.control包含了model和view成员。 链接&#xff1a; MVC框架详解_mvc架构-CSDN博客 MVC架…

C语言------指针讲解(2)

目录 一、数组名的理解 二、使用指针访问数组 三、一维数组传参的本质 四、冒泡排序 五、二级指针 六、指针数组 七、指针数组模拟二维数组 一、数组名的理解 通过学习&#xff0c;我们知道&#xff1a;数组名和数组首元素的地址打印出来的结果一模一样&#xff0c;数组…

【STM32】RTT-Studio中HAL库开发教程三:IIC通信--AHT20

文章目录 一、I2C总线通信协议二、AHT20传感器介绍三、STM32CubeMX配置硬件IIC四、RTT中初始化配置五、具体实现代码六、实验现象 一、I2C总线通信协议 使用奥松的AHT20温湿度传感器&#xff0c;对环境温湿度进行采集。AHT20采用的是IIC进行通信&#xff0c;可以使用硬件IIC或…

顺序表的应用——通讯录

通讯录的实现分为五个文件分别进行编写&#xff0c;分别为&#xff1a;SeqList.c&#xff0c;SeqList.h&#xff0c;Contact.c&#xff0c;Contact.h&#xff0c;test.c 其中前两个文件为上一篇博客中的顺序表的操作&#xff0c;后三个文件为通讯录功能的实现。 SeqList.h #d…

jenkins系列-07.轻易级jpom安装

jpom是一个容器化服务管理工具&#xff1a;在线构建&#xff0c;自动部署&#xff0c;日常运维, 比jenkins轻量多了。 本篇介绍mac m1安装jpom: #下载&#xff1a;https://jpom.top/pages/all-downloads/ 解压&#xff1a;/Users/jelex/Documents/work/jpom-2.10.40 启动前修…

Ubuntu上安装配置samba服务

Ubuntu上安装配置samba服务 在Ubuntu中安装配置samba共享服务&#xff0c;可以让你在网络上共享文件和打印机。以下是一个相对详细的步骤指南&#xff0c;介绍如何在Ubuntu上安装和配置Samba。 1. 安装Samba 首先&#xff0c;需要安装Samba软件包。打开终端并运行以下命令&a…

在SpringCloud中如何轻松实现微服务间的通信

在Spring Cloud中&#xff0c;实现微服务间的通信非常简单。Spring Cloud提供了多种方式来进行微服务之间的通信&#xff0c;包括使用RestTemplate、Feign、Ribbon、Eureka等组件。下面我将详细介绍这些方式的使用方法。 使用RestTemplate进行通信&#xff1a; RestTemplate是S…

Qt 多语言

记录Qt多语言的实现过程 目录 1.项目配置文件.pro配置 2.程序中的字符串用tr()封装 3.生成翻译文件 4.使用Qt语言家修改翻译文件 4.1使用Qt语言家打开 4.2 .更改文件配置 5. 生成qm文件 6.代码执行切换语言 6.1入口处 6.2 事件执行 0.效果 1.项目配置文件.pro配置 T…

2024年【天津市安全员C证】免费试题及天津市安全员C证考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 天津市安全员C证免费试题根据新天津市安全员C证考试大纲要求&#xff0c;安全生产模拟考试一点通将天津市安全员C证模拟考试试题进行汇编&#xff0c;组成一套天津市安全员C证全真模拟考试试题&#xff0c;学员可通过…

【C++刷题】[UVA 489]Hangman Judge 刽子手游戏

题目描述 题目解析 这一题看似简单其实有很多坑&#xff0c;我也被卡了好久才ac。首先题目的意思是&#xff0c;输入回合数&#xff0c;一个答案单词&#xff0c;和一个猜测单词&#xff0c;如果猜测的单词里存在答案单词里的所有字母则判定为赢&#xff0c;如果有一个字母是答…

docker安装nginx并配置https

参考 docker安装nginx并配置https-腾讯云开发者社区-腾讯云 (tencent.com) 证书的生成 参见&#xff1a;SpringBoot项目配置HTTPS接口的安全访问&#xff08;openssl配置&#xff09;_配置接口访问-CSDN博客 步骤 1: 拉取Nginx镜像 docker pull nginx 好使的镜像如下&#x…

「漏洞复现」同享人力资源管理系统-TXEHR V15 DownloadTemplate 文件读取漏洞

0x01 免责声明 请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;作者不为此承担任何责任。工具来自网络&#xff0c;安全性自测&#xff0c;如有侵权请联系删…

权威认可 | 海云安开发者安全助手系统通过信通院支撑产品功能认证并荣获信通院2024年数据安全体系建设优秀案例

近日&#xff0c;2024全球数字经济大会——数字安全生态建设专题论坛&#xff08;以下简称“论坛”&#xff09;在京成功举办。由全球数字经济大会组委会主办&#xff0c;中国信息通信研究院及公安部第三研究所共同承办&#xff0c;论坛邀请多位专家和企业共同参与。 会上颁发…

Python JSON处理:兼容性与高级应用

JSON&#xff08;JavaScript Object Notation&#xff09;作为当前最流行的数据传输格式&#xff0c;在Python中也有多种实现方式。由于JSON的跨平台性和简便易用性&#xff0c;它在数据交互中被广泛应用。本文将重点讨论如何熟练应用Python的JSON库&#xff0c;将JSON数据映射…

STM32智能交通灯系统教程

目录 引言环境准备智能交通灯系统基础代码实现&#xff1a;实现智能交通灯系统 4.1 数据采集模块 4.2 数据处理与控制模块 4.3 通信与网络系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;交通管理与优化问题解决方案与优化收尾与总结 1. 引言 智能交通灯系统通过STM…

数据精度丢失

js数据精度丢失 最近看面试题想到了之前在开发钟遇到过的问题&#xff0c;现总结一下 在开发过程中&#xff0c;发现从后台返回的数据结构中的id字段在前端显示为不正确的值。经过排查&#xff0c;怀疑是JavaScript中Number类型精度丢失的问题。通过将id字段的类型从Number改为…

朴素模式匹配算法与KMP算法(非重点)

目录 一. 朴素模式匹配算法1.1 什么是字符串的匹配模式1.2 朴素模式匹配算法1.3 通过数组下标实现朴素模式匹配算法 二. KMP算法2.1 算法分析2.2 用代码实现&#xff08;只会出现在选择题&#xff0c;考察代码的概率不大&#xff09; 三. 手算next数组四. KMP算法的进一步优化4…

pdf工具

iLovePDF | 为PDF爱好者提供的PDF文件在线处理工具 https://www.ilovepdf.com/zh-cn 图片 pdf 合并成一个pdf也可以拆分

工业三防平板可优化工厂流程管理

在当今高度自动化和数字化的工业生产环境中&#xff0c;工业三防平板正逐渐成为优化工厂流程管理的关键工具。其强大的功能和卓越的性能&#xff0c;为工厂带来了更高的效率、更低的成本以及更出色的质量控制。 工业三防平板&#xff0c;顾名思义&#xff0c;具备防水、防尘、防…