B树、B+树详解

article/2025/9/9 4:45:52

B-树,即为B树。因为B树的原英文名称为B-tree,目前理解B的意思为平衡。

概念

首先,B树不要和二叉树混淆,在计算机科学中,B树是一种自平衡树数据结构,它维护有序数据并允许以对数时间进行搜索,顺序访问,插入和删除。B树是二叉搜索树的一般化,因为节点可以有两个以上的子节点。[1]与其他自平衡二进制搜索树不同,B树非常适合读取和写入相对较大的数据块(如光盘)的存储系统。它通常用于数据库和文件系统。

B树定义

B树是一种平衡的多分树,通常我们说m阶的B树,它必须满足如下条件:

  • 每个节点最多只有m个子节点。
  • 每个非叶子节点(除了根)具有至少⌈ m/2⌉子节点。
  • 如果根不是叶节点,则根至少有两个子节点。
  • 具有k个子节点的非叶节点包含k -1个键。
  • 所有叶子都出现在同一水平,没有任何信息(高度一致)。

什么是B树的阶 ?

B树中一个节点的子节点数目的最大值,用m表示,假如最大值为10,则为10阶,如图
在这里插入图片描述

所有节点中,节点【13,16,19】拥有的子节点数目最多,四个子节点(灰色节点),所以可以定义上面的图片为4阶B树。

什么是根节点 ?

节点【10】即为根节点;
特征:根节点拥有的子节点数量的上限和内部节点相同,如果根节点不是树中唯一节点的话,至少有俩个子节点(不然就变成单支了)。
在m阶B树中(根节点非树中唯一节点),那么有关系式2<= M <=m,M为子节点数量;包含的元素数量 1<= K <=m-1,K为元素数量。

什么是内部节点 ?

节点【13,16,19】、节点【3,6】都为内部节点;
特征:内部节点是除叶子节点和根节点之外的所有节点,拥有父节点和子节点。
假定m阶B树的内部节点的子节点数量为M,则一定要符合(m/2)<= M <=m关系式,包含元素数量M-1;包含的元素数量 (m/2)-1<= K <=m-1,K为元素数量。m/2向上取整。

什么是叶子节点?

节点【1,2】、节点【11,12】等最后一层都为叶子节点;
叶子节点对元素的数量有相同的限制,但是没有子节点,也没有指向子节点的指针。
特征:在m阶B树中叶子节点的元素符合(m/2)-1<= K <=m-1。

插入

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

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

上面三段话为插入动作的核心,接下来以5阶B树为例,详细讲解插入的动作;

5阶B树关键点:

  • 2<=根节点子节点个数<=5
  • 3<=内节点子节点个数<=5
  • 1<=根节点元素个数<=4
  • 2<=非根节点元素个数<=4
    插入8
    在这里插入图片描述

图(1)插入元素【8】后变为图(2),此时根节点元素个数为5,不符合 1<=根节点元素个数<=4,进行分裂(真实情况是先分裂,然后插入元素,这里是为了直观而先插入元素,下面的操作都一样,不再赘述),取节点中间元素【7】,加入到父节点,左右分裂为2个节点,如图
在这里插入图片描述

接着插入元素【5】,【11】,【17】时,不需要任何分裂操作,如图(4)

在这里插入图片描述

插入元素【13】
在这里插入图片描述

节点元素超出最大数量,进行分裂,提取中间元素【13】,插入到父节点当中,如图(6)
在这里插入图片描述

接着插入元素【6】,【12】,【20】,【23】时,不需要任何分裂操作,如图(7)
在这里插入图片描述

插入【26】时,最右的叶子结点空间满了,需要进行分裂操作,中间元素【20】上移到父节点中,注意通过上移中间元素,树最终还是保持平衡,分裂结果的结点存在2个关键字元素。
在这里插入图片描述

插入【4】时,导致最左边的叶子结点被分裂,【4】恰好也是中间元素,上移到父节点中,然后元素【16】,【18】,【24】,【25】陆续插入不需要任何分裂操作
在这里插入图片描述

最后,当插入【19】时,含有【14】,【16】,【17】,【18】的结点需要分裂,把中间元素【17】上移到父节点中,但是情况来了,父节点中空间已经满了,所以也要进行分裂,将父节点中的中间元素【13】上移到新形成的根结点中,这样具体插入操作的完成。

在这里插入图片描述

删除

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

  • 某结点中元素数目小于(m/2)-1,(m/2)向上取整,则需要看其某相邻兄弟结点是否丰满;

  • 如果丰满(结点中元素个数大于(m/2)-1),则向父节点借一个元素来满足条件;

  • 如果其相邻兄弟都不丰满,即其结点数目等于(m/2)-1,则该结点与其相邻的某一兄弟结点进行“合并”成一个结点;
    接下来还以5阶B树为例,详细讲解删除的动作;

  • 关键要领,元素个数小于 **2(m/2 -1)就合并,大于4(m-1)**就分裂
    如图依次删除依次删除【8】,【20】,【18】,【5】

在这里插入图片描述

首先删除元素【8】,当然首先查找【8】,【8】在一个叶子结点中,删除后该叶子结点元素个数为2,符合B树规则,操作很简单,咱们只需要移动【11】至原来【8】的位置,移动【12】至【11】的位置(也就是结点中删除元素后面的元素向前移动)

在这里插入图片描述

下一步,删除【20】,因为【20】没有在叶子结点中,而是在中间结点中找到,咱们发现他的继承者【23】(字母升序的下个元素),将【23】上移到【20】的位置,然后将孩子结点中的【23】进行删除,这里恰好删除后,该孩子结点中元素个数大于2,无需进行合并操作。
在这里插入图片描述

下一步删除【18】,【18】在叶子结点中,但是该结点中元素数目为2,删除导致只有1个元素,已经小于最小元素数目2,而由前面我们已经知道:如果其某个相邻兄弟结点中比较丰满(元素个数大于ceil(5/2)-1=2),则可以向父结点借一个元素,然后将最丰满的相邻兄弟结点中上移最后或最前一个元素到父节点中,在这个实例中,右相邻兄弟结点中比较丰满(3个元素大于2),所以先向父节点借一个元素【23】下移到该叶子结点中,代替原来【19】的位置,【19】前移;然【24】在相邻右兄弟结点中上移到父结点中,最后在相邻右兄弟结点中删除【24】,后面元素前移。
在这里插入图片描述

最后一步删除【5】, 删除后会导致很多问题,因为【5】所在的结点数目刚好达标,刚好满足最小元素个数(ceil(5/2)-1=2),而相邻的兄弟结点也是同样的情况,删除一个元素都不能满足条件,所以需要该节点与某相邻兄弟结点进行合并操作;首先移动父结点中的元素(该元素在两个需要合并的两个结点元素之间)下移到其子结点中,然后将这两个结点进行合并成一个结点。所以在该实例中,咱们首先将父节点中的元素【4】下移到已经删除【5】而只有【6】的结点中,然后将含有【4】和【6】的结点和含有【1】,【3】的相邻兄弟结点进行合并成一个结点。

在这里插入图片描述

也许你认为这样删除操作已经结束了,其实不然,在看看上图,对于这种特殊情况,你立即会发现父节点只包含一个元素【7】,没达标(因为非根节点包括叶子结点的元素K必须满足于2=<K<=4,而此处的K=1),这是不能够接受的。如果这个问题结点的相邻兄弟比较丰满,则可以向父结点借一个元素。而此时兄弟节点元素刚好为2,刚刚满足,只能进行合并,而根结点中的唯一元素【13】下移到子结点,这样,树的高度减少一层。
在这里插入图片描述

树的高度

一棵含有N个总关键字数的m阶的B树的最大高度是多少?

log(m/2)(N+1)/2 + 1 ,log以(m/2)为低,(N+1)/2的对数再加1
算法如下:
在这里插入图片描述

B+树

B+树是应文件系统所需而产生的B树的变形树,那么可能一定会想到,既然有了B树,又出一个B+树,那B+树必然是有很多优点的

B+树的特征:

有m个子树的中间节点包含有m个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引;
所有的叶子结点中包含了全部关键字的信息,及指向含有这些关键字记录的指针,且叶子结点本身依关键字的大小自小而大的顺序链接。 (而B 树的叶子节点并没有包括全部需要查找的信息);
所有的非终端结点可以看成是索引部分,结点中仅含有其子树根结点中最大(或最小)关键字。 (而B 树的非终节点也包含需要查找的有效信息);

为什么说B+树比B树更适合数据库索引?

1)B+树的磁盘读写代价更低

B+树的内部结点并没有指向关键字具体信息的指针。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了;

2)B+树查询效率更加稳定

由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当;

3)B+树便于范围查询(最重要的原因,范围查找是数据库的常态)

B树在提高了IO性能的同时并没有解决元素遍历的我效率低下的问题,正是为了解决这个问题,B+树应用而生。B+树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树不支持这样的操作或者说效率太低;不懂可以看看这篇解读-》范围查找

补充:B树的范围查找用的是中序遍历,而B+树用的是在链表上遍历;

B+树如下:

在这里插入图片描述


http://chatgpt.dhexx.cn/article/j6fpP4AE.shtml

相关文章

【B树及B树的基本操作】

文章目录 1.B树的定义和特性2.B树的性质3.B树创建的过程。4.B树的删除5.总结 1.B树的定义和特性 B树是一种平衡的多路查找树。 一棵m阶的B树&#xff08;B树中所有结点的孩子个数的最大值为m)&#xff0c;或为空树&#xff0c;或为满足下列特性的m叉树&#xff1a; (1) 树中每…

B树和B+树的区别

文章目录 简述写在前面1、B树2、B树 深入浅出B树B树深入B-树的查找 B 树B树概述 B-树和B树的区别拓展&#xff1a;MySQL为什么使用B-Tree&#xff08;BTree&#xff09;&& 存储知识存储数据最小单元主存存取原理磁盘存取原理 总结 简述 写在前面 大家在面试的时候&am…

B树(B-树)详解

B-树&#xff0c;即为B树。因为B树的原英文名称为B-tree&#xff0c;而国内很多人喜欢把B-tree译作B-树&#xff0c;B-tree就是指的B树。 B-树容易让人误解,建议大家用B树称呼, 本文以下直称B树 这篇介绍概念, 优点应用等, B树的描述和增删改查请到隔壁我写的另一篇(篇幅较长…

数据结构 —— B树

文章目录 1、B树的定义1.1、B树的特性1.2、B树的高度1.3、性能分析1.4、B树的补充说明1.5 、B树、B-树 、B-tree、B tree的区别 2、B树的插入操作以5阶B树为例&#xff0c;介绍B树的插入操作&#xff0c; 3、 B树的删除操作以5阶B树为例&#xff0c;介绍B树的删除操作 4、B树相…

B树和B+树详解

B树、B树看这一篇就够了 [TOC](B树、B树看这一篇就够了) 引言B树什么是B树以及B树是怎么来的B树的基本性质B树的新增和删除B树的插入B树的删除 B树什么是B树以及为什么要有B树B树的基本性质B树的查找 B树与B树的比较B树的优势B树的优势两者的细节对比 B树与B树在实际代码中的应…

B-树(B树)详解

https://www.jianshu.com/p/7dedb7ebe033 具体讲解之前&#xff0c;有一点&#xff0c;再次强调下&#xff1a;B-树&#xff0c;即为B树。因为B树的原英文名称为B-tree&#xff0c;而国内很多人喜欢把B-tree译作B-树&#xff0c;其实&#xff0c;这是个非常不好的直译&#xf…

B树和B+树

目录 一、BST树到AVL树到B树的简介 1.1 BST树 --- 二叉排序树 1.2 AVL树 --- 平衡二叉树 1.3 B树 --- 平衡多路查找树 1.3.1 B树的查找结点过程 1.3.2 B树的添加结点过程&#xff08;和结点分裂过程&#xff09; 1.3.3 B树的删除结点过程 二、B树 2.1 B树和B树 一…

在群晖NAS部署_开源在线项目任务管理工具【dooTask】

一、dooTask简介 1.1、说明 Dootask 是一款由国人开源的轻量级在线项目任务管理工具&#xff0c;它提供各类文档协作工具、在线思维导图、在线流程图、项目管理、任务分发、即时通讯IM&#xff0c;文件管理等功能。基于PHP与Vue编写&#xff0c;遵守AGPL3.0开源协议。 1.2、特…

软件项目管理的重点知识

软件项目管理的重点知识 1.软件项目管理概述 1.1项目是什么 项目是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力。 1.2常见的项目 生活中的项目 生日聚会野餐活动集体婚礼 大项目 微软的操作系统阿波罗计划神州飞船计划鸿蒙操作系统开发一个网站运…

推荐八款好用的项目管理工具

要想取得项目成功&#xff0c;避不开包括计划、执行、监控等。使用项目管理工具可以帮助项目经理制定项目计划&#xff0c;监控项目执行&#xff0c;跟踪项目进度。 1、进度猫 进度猫是国产的一款项目管理工具以甘特图为向导&#xff0c;基于任务清单todolist&#xff0c;支持…

工程项目管理软件有哪些?这六款很好用!

工程项目管理软件哪个好用&#xff1f;这六款很不错&#xff01; 在现代社会中&#xff0c;软件已经成为了企业信息化、项目管理等方面必不可少的工具。尤其是对于工程项目管理而言&#xff0c;借助软件进行协同、计划、控制等方面的工作&#xff0c;已经成为了必要的手段。但…

项目管理-软件:国内外知名IT项目管理工具【Worktile、PingCode、Jira、Clarizen、禅道】

IT项目管理随着敏捷的普及&#xff0c;支持其开发模式的工具也越来越多。它和瀑布工具的巨大差异在于一个是任务管理模式&#xff0c;一个是需求驱动管理模式。在这里&#xff0c;我列出了在国内外最知名最好用的敏捷工具及其网站。IT项目管理&#xff0c;或者说研发管理软件是…

10款最佳项目管理工具推荐

1、进度猫 进度猫是一款以甘特图为向导的轻量级在线免费项目进度管理工具。 特点&#xff1a; 基于甘特图、进度管理、任务管理ToDo、在线思维导图、团队协作随时把控项目进度,让项目管理一目了然。 甘特图显示项目的进度和具体任务清单。 对未完成任务、已完成任务进行分类…

知乎热推 6 款在线项目管理工具测评

用了一段时间的项目管理工具后&#xff0c;简单的总结项目管理工具就是&#xff1a; 一个能够满足项目经理对项目资源&#xff08;人员、文件和时间&#xff09;的管理&#xff0c;同时提供了项目进度可视化展示和支持团队合作的平台工具。 在这里&#xff0c;对知乎上热推的几…

项目管理系统源码

项目管理系统源码 功能介绍&#xff1a; 1&#xff1a;权限管理 。 对公司人员&#xff0c;组织架构进行管理&#xff0c;对用户采用角色授权的方式控制结点、菜单权限 3&#xff1a;项目管理。 对一个项目可以进行分阶段&#xff0c;分任务…划分&#xff0c;对每个划分点…

说好求一款在线项目管理软件,你们为什么推荐钉钉?

作为一名整天被各种项目虐得发际线不断后移的项目经理&#xff0c;对于项目管理工具&#xff0c;我是认真的。然而&#xff0c;混迹某些交流群中&#xff0c;时不时碰到有人询问推荐在线项目管理工具&#xff0c;总有人出来说&#xff1a;钉钉。纳尼&#xff1f;钉钉在我眼里真…

如何在项目管理中使用PERT图

PERT是一个项目管理计划工具&#xff0c;用于计算实际完成项目所需的时间。PERT代表计划评估审查技术。PERT图表是用于计划项目内任务的工具 - 可以更轻松地安排和协调完成工作的团队成员。 PERT图表创建于20世纪50年代&#xff0c;旨在帮助管理美国海军的武器和防御项目的创建…

项目资源管理

目录 申明1. 核心概念2. 虚拟团队/分布式团队3. 规划质量管理3.1.1 输入3.1.2 工具和技术3.1.2.1 责任分配矩阵 3.1.3 输出 4. 估算活动资源4.1.1 输入4.1.2 工具与技术4.1.3 输出4.1.3.1 资源分解结构RBS 5. 获取资源5.1.1 输入5.1.2 工具与技术5.1.3 输出 6. 建设团队6.1.1 输…

发现一款好用的在线项目管理工具(有免费版)

&#xff08;注&#xff1a;本文转载自网络&#xff09; 在线项目管理工具指的是不用安装服务器的云部署项目管理软件&#xff0c;这种部署方式的软件可随时开通、节约成本&#xff0c;但质量也参差不齐。 考虑到多方面因素&#xff0c;我们公司最终决定用在线的项目管理工具&…

计算机毕业设计PHP在线项目管理(源码+程序+VUE+lw+部署)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; phpStudy Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; 原生PHP Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要…