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

news2024/9/20 15:07:45

目录

  • 一、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树)的定义及操作

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 3

typedef 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-树类似。

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

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

相关文章

jmeter-beanshell学习10-字符串补齐位数

每天都遇到新问题&#xff0c;今天又一个场景&#xff0c;一个字符串&#xff0c;如果不足11位&#xff0c;则左边补0&#xff0c;补够11位。 先要获取字符串长度&#xff0c;然后计算差多少位&#xff0c;补齐。今天又发现一个Object类型&#xff0c;这个类型有点厉害&#x…

uniapp启动图延时效果,启动图的配置

今天阐述uniapp开发中给启动图做延迟效果&#xff0c;不然启动图太快了&#xff0c;一闪就过去了&#xff1b; 一&#xff1a;修改配置文件&#xff1a;manifest.json "app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"…

dhtmlx-gantt甘特图数据展示

官网文档&#xff1a;甘特图文档 实现效果&#xff1a; 首先需要下载 dhtmlx-gantt组件 npm i dhtmlx-gantt //我项目中使用的是"dhtmlx-gantt": "^8.0.6" 这个版本&#xff0c;不同的版本api或是文档中存在的方法稍有差异 界面引用 <template>&l…

二叉搜索树的实现[C++]

文章目录 搜索二叉树概念二叉搜索树的功能查找 实现搜索二叉树节点的定义建立搜索二叉树接口插入搜索打印删除 总结 今天本堂主来一起讨论下什么是搜索二叉树&#xff0c;和如何实现二叉搜索树 搜索二叉树 那么二叉搜索树似乎如何实现搜索呢&#xff1f;二叉搜索树和普通二叉…

PNPM 高效入门:安装配置一本通

PNPM高效入门&#xff1a;安装配置一本通 引言Pnpm 简介安装 PNPM全局安装&#xff08;推荐&#xff09;使用 nvm&#xff08;Node Version Manager&#xff09; 配置PNPM使用PNPM管理项目初始化项目 添加依赖快速安装所有依赖查看安装的包 优化与故障排除PNPM与持续集成/持续部…

nacos 适配瀚高数据库、ARM 架构

下载nacos源码: https://github.com/alibaba/nacos/tree/2.3.1 瀚高技术文档 1、修改pom.xml 根目录nacos-all => pom.xml<dependencyManagement><dependency><groupId>com.highgo</groupId><artifactId>HgdbJdbc</artifactId><…

安全防御:防火墙基本模块

目录 一、接口 1.1 物理接口 1.2 虚拟接口 二、区域 三、模式 3.1 路由模式 3.2 透明模式 3.3 旁路检测模式 3.4 混合模式 四、安全策略 五、防火墙的状态检测和会话表技术 一、接口 1.1 物理接口 三层口 --- 可以配置IP地址的接口 二层口&#xff1a; 普通二层…

linux的学习(四):磁盘,进程,定时,软件包的相关命令

简介 关于磁盘管理&#xff0c;进程管理&#xff0c;定时任务&#xff0c;软件包管理的命令的使用 磁盘管理类命令 du du 目录名&#xff1a; 查看文件和目录占用的磁盘空间 参数&#xff1a; -h&#xff1a;可以看到大小的单位&#xff0c;g,mb-a&#xff1a;还可以看到文…

Mapboxgl 生成飞行动画GIF

更多精彩内容尽在数字孪生平台&#xff0c;关注公众号【sky的数孪技术】&#xff0c;技术交流、源码下载请添加VX&#xff1a;digital_twin123 根据两点生成动画的工具。 首先&#xff0c;找到你想要开始的视图&#xff0c;点击“设置起点视图”&#xff0c;然后调整到目的视图…

Android中RecyclerView使用详解(一)

目录 概述优点列表布局RecyclerView一、创建RecyclerView并且在布局中绑定二、实现RecyclerView单个item的布局三、给RecyclerView写一个对应的适配器Adapter1.创建自定义的ViewHolder2.继承Adapter&#xff0c;泛型使用我们自定义的ViewHolder3.重写Adapter的三个方法onCreate…

如何提取视频中的音频?提取音频的几种方法

如何提取视频中的音频&#xff1f;提取视频中的音频&#xff0c;是许多人在处理多媒体内容时常遇到的需求。这一过程不仅仅是简单地从视听媒体中抽离音频部分&#xff0c;它背后蕴含着许多技术上的挑战和创意上的可能性。通过提取音频&#xff0c;你可以更方便地利用视频中的声…

网络安全——防御(防火墙)带宽以及双机热备实验

12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流量不超过100M&#xff0c;其中销售部人员在其…

docker镜像导出与导入

布置程序出问题了&#xff0c;拉不下来镜像 程序的配置文件里面有镜像的名字 docker pull ubuntu/squid:latest 我是本地下载了镜像&#xff0c;使用本地的镜像导出 导出镜像使用 docker 导出导入镜像 要在Docker中导出和导入镜像&#xff0c;您可以使用docker save命令来导…

《昇思25天学习打卡营第5天|10使用静态图加速》

写在前面 跳过了模型训练和保存两节&#xff0c;模型训练的例子已经学习过&#xff0c;都是重复的内容&#xff0c;不进行详细的学习了&#xff0c;除非要使用类似的函数。 因此接下来开始学习初学教程的最后一节&#xff1a;使用静态图加速&#xff0c;希望能学习到一些内容。…

【分布式系统】CephFS文件系统之MDS接口详解

目录 一.服务端操作 1.在管理节点创建 mds 服务 2.查看各个节点的 mds 服务&#xff08;可选&#xff09; 3.创建存储池&#xff0c;启用 ceph 文件系统 4.查看mds状态&#xff0c;一个up&#xff0c;其余两个待命&#xff0c;目前的工作的是node01上的mds服务 5.创建用户…

从零开始搭建vue框架

流程图 开始 | |-- 2013 年底&#xff0c;尤雨溪开始开发 Vue 框架&#xff0c;最初命名为 Seed&#xff0c;后更名为 Vue | |-- 2013 年 12 月&#xff0c;Vue 0.6.0 版本 | |-- 2014 年 1 月 24 日&#xff0c;Vue 0.8.0 版本发布 | |-- 2014 年 2 月 25 日&#xff0c;…

数据中心内存RAS技术发展背景

随着数据量的爆炸性增长和云计算的普及&#xff0c;数据中心内存的多比特错误及由无法纠正错误(UE)导致的停机问题日益凸显&#xff0c;这些故障不仅影响服务质量&#xff0c;还会带来高昂的修复或更换成本。随着工作负载、硬件密度以及对高性能要求的增加&#xff0c;数据中心…

408数据结构-图的应用3-有向无环图、拓扑排序 自学知识点整理

前置知识&#xff1a;表达式&#xff0c;图的遍历 有向无环图描述表达式 有向无环图&#xff1a;若一个有向图中不存在环&#xff0c;则称为有向无环图&#xff0c;简称 D A G DAG DAG图 。 &#xff08;图片来自王道考研408数据结构2025&#xff09; 由王道考研-咸鱼学长的讲…

进销存管理系统设计

进销存管理系统&#xff08;Inventory Management System&#xff0c;简称IMS&#xff09;是一种帮助企业有效管理商品的入库、出库及库存情况的信息系统。良好的进销存管理系统能够提升库存周转率、减少库存成本、提高订单处理效率&#xff0c;从而增强企业的市场竞争力。以下…

SD card知识总结

一、基础知识 1、简介 SD Card 全称(Secure Digital Memory Card)&#xff0c;日本电子公司松下&#xff08;Panasonic&#xff09;、瑞典公司爱立信&#xff08;Ericsson&#xff09;、德国公司西门子&#xff08;Siemens&#xff09;共同开发的&#xff0c;于1999年发布根…