数据结构——B树和B+树

news2025/1/17 5:49:45

数据结构——B树和B+树

  • 一、B树
    • 1.B树的特征
    • 2.B树的插入操作
    • 3.B树的删除操作
    • 4.B树的缺点
  • 二、B+树
    • B+树的特征

平衡二叉树或红黑树的查找效率最高,时间复杂度是O(nlogn)。但不适合用来做数据库的索引树。

因为磁盘和内存读写速度有明显的差距,磁盘中存储的数据需要先读取到内存中才能进行高速的检索。而数据库当中存储着海量的数据,光是数据库索引就有可能占据几个GB甚至更大的空间。当我们要查找数据的时候,显然不可能把整个索引树读到内存中。因此,我们只能以索引树的节点为基本单元,每次把单一节点从磁盘读取到内存当中,进行后续操作。

如果磁盘当中的索引树是一棵平衡二叉树,查找的时候,在最坏情况下,磁盘I/O的次数等于索引树的高度。

为了减少磁盘I/O,我们需要把原本“瘦高”的树结构变得“矮胖”,让每一个节点承载更多的元素,拥有更多的孩子。

B树和B+树,就是这样的数据结构,因此它们非常适合做数据库和文件系统的索引。

一、B树

1.B树的特征

B树也被称为B-树(中间的横线是一个连接符,不是“B减树”!)

B树单一节点拥有的最多子节点数量,称为B树的“阶”。一个m阶的B树,具有如下几个特征:

  1. 根节点至少有两个子节点。
  2. 每个中间节点都包含k-1个元素(也被称为关键字)和k个孩子,其中m/2 <= k <= m。
  3. 每一个叶子节点都包含k-1个元素,其中m/2 <= k <= m。
  4. 所有的叶子节点都位于同一层。
  5. 每个节点中的元素从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域分划。

如图是一个3阶的B树:
在这里插入图片描述

B树的查找过程(以上图中查找5为例):
在这里插入图片描述
B树查询中的比较次数其实不比平衡二叉树少,但是节点内部元素的比较是在内存中进行的,时间成本几乎可以忽略。真正影响性能的,是磁盘I/O的次数,只要树的高度降低,磁盘I/O次数就会相应减少,从而提高整体性能。

2.B树的插入操作

B树的插入操作,首先是在叶子节点进行的,可以分成两种情况:

1)插入元素未改变规则,即叶子节点元素数量不超过m-1

未改变规则,就不用做任何调整。

2)插入元素使叶子节点元素过多,超过m-1个元素
在这里插入图片描述
新插入的元素4使相应的叶子节点元素超过2个,打破了3阶B树的规则。于是,需要进行节点的“分裂”,把节点m/2位置的元素上升到父节点,剩余的左半边元素和右半边元素分成两个独立的叶子节点:
在这里插入图片描述

此时,父节点(2,4,6)的元素同样超过了2个,我们继续对父节点
进行分裂,元素4上升到祖父节点:
在这里插入图片描述

这一次并没有打破B树的规则,插入调整完毕。

3.B树的删除操作

分为4种情况:

1)删除元素在叶子节点,未改变规则

没有打破B树的规则,因此不用做任何调整。

2)删除元素在叶子节点,剩余元素不足,相邻兄弟节点有多余元素
在这里插入图片描述

如图所示,删除叶子节点的元素8之后,该节点少于1个元素。此时可以向左侧兄弟节点“借调”一个元素过来。但元素5不能直接放到元素8的位置,需要上升到父节点当中,再把元素5和8之间的元素6移动到元素8的位置:
在这里插入图片描述
3)删除元素在叶子节点,剩余元素不足,相邻兄弟节点没有多余元素
在这里插入图片描述
如上图所示,删除叶子节点的元素3之后,该节点少于1个元素,左右兄弟也没有多余的节点可以借调。此时我们可以把相邻叶子节点“合并”。删除的元素3和右侧相邻节点的元素8之间是元素6,我们可以把元素6和8合并成一个叶子节点:
在这里插入图片描述

4)删除元素在中间节点
在这里插入图片描述

如上图所示,删除的是中间节点的元素12,我们可以选择该元素的前驱或后继元素来顶替它的位置。在本例中,选择后继元素13更合适:
在这里插入图片描述

4.B树的缺点

B树不方便进行范围查询。

数据库的查询,不止涉及单一结果查询(比如查找学号是110235的学生),也会涉及一个区间内结果的查询(比如查找数学成绩60~80分的所有学生)。
对于前者,B树很容易实现,对于后者,由于区间内结果分布在各个层次的节
点当中,B树实现起来会非常烦琐,需要进行中序遍历,在父节点和子节点之间不断切换,给磁盘I/O带来很多负担。

二、B+树

B+树是B树的升级,它的结构设计为范围查询提供了便利。

B+树的特征

一个m阶的B+树具有如下几个特征:

  1. 有k个子树的中间节点包含k个元素(B树中是k-1个元素),每个元素不保存数据,所有数据都保存在叶子节点。
  2. 所有的叶子节点包含了全部元素,依照元素的大小升序排列,叶子节点之间用双向指针相连接。
  3. 所有中间节点的元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

在这里插入图片描述
如上图是一颗B+树,每一个父节点的元素都出现在子节点中,是子节点的最大(或最小)元素。父节点的所有元素都出现在子节点,因此叶子节点包含了整棵树的全量信息。并且每一个叶子节点都带有指向相邻叶子节点的指针,形成了一个双向有序链表。

B+树的设计,让我们可以很方便地进行范围查询。

要查找区间范围内的元素时,首先自顶向下,查找区间的最小值所在的叶子节点,再通过链表指针,遍历到相邻叶子节点,直到在叶子节点中找到区间最大值,这样就成功找出了区间内的所有元素。

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

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

相关文章

玩转肺癌目标检测数据集Lung-PET-CT-Dx ——③整理、验证数据,建立Dataset对象

文章目录 数据整理整理出所有的dcm文件整理出所有的xml标注文件整理数据①——舍弃错误的标注文件整理数据②——两个标注文件指向同一个目标图片的情况封装函数&#xff0c;传入xml文件&#xff0c;显示标注效果 整理数据③——将PETCT的三通道图像转成平扫CT的单通道图像格式…

企业费控,驶向「一体化」

在数字化于企业内部各个环节实现平权、成为标配的当下&#xff0c;财务&#xff0c;这个被称为“控制企业生命力”的核心环节&#xff0c;是否应该拥有新的价值&#xff1f; 作者| 皮爷 出品|产业家 2022年年中&#xff0c;施伟和分贝通的团队接到一项“特殊需求”。 这个…

在职读研专业——劳动经济学

研究方向&#xff1a;劳动经济学主要研究劳动力市场现象及其所引起的劳动力资源配置等相关问题&#xff0c;包括劳动力供给、劳动力需求、就业、工资、人力资本投资、收入分配等。例如&#xff1a;劳动力市场失衡背后各种因素的变化&#xff0c;如何通过资源的配置使劳动资源配…

MySQL innobackupex 备份工具使用总结

前言 在MySQL备份以及搭建从库的过程中&#xff0c;我们针对比较小的库大多采用的是mysqldump&#xff0c;简单&#xff0c;方便。但是在大库进行搭建从库的时候&#xff0c;且数据库主机没有一个很好的存储来满足备份&#xff0c;这个时候就需要使用innobackupex来协助你来做一…

Pocsuite3框架POC/EXP编写练习:Flask(Jinja2) 服务端模板注入漏洞

Pocsuite3 是由知道创宇 404 实验室打造的一款基于 GPLv2 许可证开源的远程漏洞测试框架。可以用来编写POC/EXP&#xff0c;今天借助Flask框架下的SSTI漏洞练习记录一下Pocsuite3框架的配置和编写过程。 官方文档&#xff1a;Pocsuite3 是什么&#xff1f; | Pocsuite3 安装 …

小黑继续跟着沛奇老师学携程:携程基础3

3.异步编程 3.1事件循环 理解成一个死循环&#xff0c;去检测并执行某些代码 # 伪代码任务列表 [任务1&#xff0c;任务2&#xff0c;任务3&#xff0c;...] while True:可执行的任务列表&#xff0c;已完成的任务列表 去任务列表中检查所有任务&#xff0c;将可执行和已完…

安装、启动和登陆doccano

一、安装 1、使用的Pycharm安装的doccano 2、初始化数据库 doccano init 3、创建用户名和密码 # admin是用户名&#xff0c;pass是密码&#xff0c;都可以自定义 doccano createuser --username admin --password pass 二、启动 1、在一个Terminal终端启动webserver服务 …

自适应控制专栏目录及介绍

目录 自适应控制专栏目录及介绍第一篇&#xff1a;[具有不确定参数系统的自适应跟踪控制设计_ADi_hhh的博客-CSDN博客](https://blog.csdn.net/qq_45830323/article/details/129713051)第二篇&#xff1a;[&#xff08;SISO&#xff09;单输入单输出系统的模型参考自适应控制_A…

cdh Hue集成sentry的权限管理详细步骤

hue登录hue的第一个用户要用hue用户创建,默认hue为超级用户,hue用户页面的权限可以管理很多用户操作,比如查看hdfs目录,使用其他组件,授权功能等等 一.hive的配置 1.关闭模拟,开启sentry 2.添加配置(注意配置的位置) <property> <name>sentry.hive.tes…

【C++11】lambda表达式

目录 lambda表达式 1.1 lambda表达式出现的原因 1.2 lambda表达式语法 1.3 函数对象与lambda表达式 lambda表达式 1.1 lambda表达式出现的原因 在C98中&#xff0c;如果想要对一个数据集合中的元素进行排序&#xff0c;可以使用 std::sort 方法 测试代码 #include <…

苹果撤离中国市场?中国市场太重要,印度制造是备胎

苹果在中国之行后&#xff0c;却计划进一步扩大印度制造iPhone的比例&#xff0c;甚至将iPhone15全数交给印度制造&#xff0c;业界因此认为苹果正在离开中国市场&#xff0c;然而这完全是臆想&#xff0c;中国市场对苹果来说仍然非常重要&#xff0c;它不会轻易舍弃这个市场。…

【Unity VR开发】结合VRTK4.0:添加碰撞忽略器

语录&#xff1a; 最远的旅行&#xff0c;是从自己的身体到自己的心&#xff0c;是从一个人的心到另一个人的心。坚强不是面对悲伤不流一滴泪&#xff0c;而是擦干眼泪后微笑面对以后的生活。 前言&#xff1a; 模块化提供了一种允许两个或者多个对象忽略彼此碰撞的方法&#x…

Logstash:多管道配置

我们大多数人已经熟悉 Elastic 产品。 在此博客中&#xff0c;我们将逐步介绍配置 Logstash 以使用多个管道摄取和处理数据的步骤。 Logstash 是一种开源数据处理管道&#xff0c;可让你摄取、转换和输出数据。 它是从各种来源收集和处理大量数据的强大工具&#xff0c;可用于管…

IP协议头

IP 4位版本号&#xff08;version&#xff09;4位头部长度&#xff08;header length&#xff09;8位服务类型&#xff08;Type Of Service&#xff09;16位总长度&#xff08;total length&#xff09;16位标识&#xff08;id&#xff09;3位标志字段13位分片偏移&#xff08;…

Spring的循环依赖

什么是循环依赖&#xff1f; 循环依赖其实就是循环引用&#xff0c;也就是两个或者两个以上的 bean 互相持有对方&#xff0c;最终形成闭环。比如 A 依赖于 B&#xff0c;B 依赖于 C&#xff0c;C 又依赖于 A。如下图&#xff1a; 注意&#xff0c;这里不是函数的循环调用&…

金陵科技学院五年一贯制专转本计算机应用基础考试大纲

金陵科技学院五年一贯制专转本计算机应用基础考试大纲 一、参考书目&#xff1a; 《大学计算机信息技术教程》&#xff0c;张福炎&#xff0c;孙志挥&#xff0c;南京大学出版社&#xff0c;《全国计算机等级考试一级教程计算机基础及MS Office应用》&#xff0c;教育部考试中…

书写我的人生回忆录-这应该是给子女和父母最好的礼物

作为一个业余的软件开发爱好者&#xff0c;我又捣鼓了一个有意思的小东西 &#xff0c;使用完全免费哈 您可以是以子女的身份帮助父母来完成这份回忆录&#xff1a; 《书写我的人生回忆录》是一款软件&#xff0c;其中包含70个问题&#xff0c;涵盖了父母的个人喜好、家庭、工…

关于图床使用

安装windows终端 Windows 终端安装 | Microsoft Learn 安装oh-my-posh 安装scoop &#xff08;后续都使用PowerShell 7.2.10&#xff09;&#xff1a; > Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first ti…

代谢组学-南京医科大学胡志斌团队绘制心脏发育全周期多组学图谱

文章标题&#xff1a;Multi-omics profifiling visualizes dynamics of cardiac development and functions 发表期刊&#xff1a;Cell Reports 影响因子&#xff1a;9.995 作者单位&#xff1a;南京医科大学 百趣提供服务&#xff1a;发现代谢组学HD-MIX版 百趣代谢组学分…

教你用Python破解WiFi,流量自由不再是梦!(附完整源码)

目录 一、准备工作二、编写代码三、展示测试结果四、生成密码本&#xff08;建议自己找一个密码本&#xff09; 一、准备工作 工具&#xff1a;python 二、编写代码 在桌面新建一个文件 如果你新建的文件没有后缀名.txt&#xff0c;请进行如下设置 打开刚刚新建的文件&#…