(JAVA)B树和B+树的实现原理阐述

news2024/11/24 1:32:03

1. B 树

2-3树中,一个节点最多能有两个key,它的实现红黑树中适用对链接染色的方式去表达这两个key。下面将学习另一种树形结构B树,这种数据结构中,一个节点允许多余两个key的存在。

B树是一种树状数据结构,它能够存储数据、对其进行排序并允许以O(logn)的时间复杂度进行查找、顺序读取、插入和删除等操作

1.1 B 树的特性:

B树种允许一个节点中包含多个key,可以是3个、4个、5个甚至更多,并不确定,需要看具体的实现。

我们选择一个参数 M 来构造一个B树,我们可以把它称作是 M阶 的B树,那么该树具有以下特点:

  • 每个节点最多右M-1个key,并且以升序排列:
  • 每个节点最优能有M个子节点;
  • 根节点至少有两个子节点

在这里插入图片描述

1.2 B树存储数据

若参数 M 选择为5,那么每个节点最多包含4个键值对,我们已5阶B树为例,看看B树的数据存储过程

在这里插入图片描述在这里插入图片描述

1.3 B 树中删除数据

(a)原始状态

在这里插入图片描述

(b)在上图的树中,删除21

在这里插入图片描述

由于删除21后的结点的索引值个数仍然大于2(Math.ceil( 5/2 ) -1 =2),因此删除结束。

(c)接着删除27

从上图可知,由于27是非叶子结点,所以要删除27的话,需要用27的后继替代它。从上图可以看出,27的后继是28,因此我们用28来替代27,再删除原来的28,如下图:

在这里插入图片描述

删除后发现,当前结点(当前结点如上图所示)的索引值个数小于2个,而它的兄弟结点有3个索引值(当前结点还有一个右兄弟,选择右兄弟的话,会出现合并结点的情况,不论选哪一个都可以,只是最后的B树形态会不一样而已),那么就向左兄弟借一个索引值,注意这里的借并非直接从左兄弟结点处拿一个索引值过来,如果是这样的话,就破坏了B树父节点左子树比根结点小,右子树比根结点大的特性了。借是把当前结点的父节点的28下移,然后把左兄弟结点的26上移到父节点,删除结束。如下图:

在这里插入图片描述

(d)在上述情况接着删除32

在这里插入图片描述

在删除32后,当前结点剩下31,即索引值数目小于2。这时候,它的兄弟结点,也仅仅有2个索引值,所以不能向兄弟结点借。那只能够让父结点下移一个值(30),并和兄弟结合合并成一个新的结点,如下图:

在这里插入图片描述

当前结点的索引值个数不小于2 (Math.ceil( 5/2 ) -1 =2),满足条件,删除结束。

(e)接着删除 40:

在这里插入图片描述

当前结点由于索引值小于2,因此需要像父结点借,父结点下移36到当前结点,然后和兄弟结点合并(选择左兄弟或右兄弟都可以,这里我选择了左兄弟),如下图:

在这里插入图片描述

但这时候发现,新的当前结点的索引值个数又小于2了,那么只能向其父结点借了,所以其父结点下移33,然后当前结点和其兄弟结点合并,如下图:

在这里插入图片描述

删除结束。

1.4 B树在磁盘文件中的应用

在我们的程序中,不可避免的需要通过IO操作文件,而我们的文件是存储在磁盘上的。计算机操作磁盘上的文件是通过文件系统进行操作的,在文件系统中就使用到了B树这种数据结构。

1.4.1 磁盘

磁盘能够保存大量的数据,从GB一直到TB级,但是它的读取速度比较慢,因为设计到机器操作,读取速度为毫秒级。

在这里插入图片描述

磁盘由盘片构成。每个盘片有两面,又称为盘面。盘片中央有一个可以旋转的主轴,它使得盘片以固定的旋转速率旋转,通常是5400rpm或者是7200rpm,一个磁盘中包含了多个这样的盘片并封装在一个密封的容器内。盘片的每个表面是由一个组称为磁道同心圆组成的,每个磁道被划分为了一组扇区,每个扇区包含相等数量的数据为,通常是512字节,扇区之间由一些间隙隔开,这些间隙中不存储数据。

1.4.2 磁盘IO

在这里插入图片描述

磁盘用磁头来读写存储在盘片表面的位,而磁头连接到一个移动臂上,移动臂沿着盘片半径前后移动,可以将磁头定位到任何磁道上,这称为寻道操作。一旦定位到磁道后,盘片转动,磁道上的每个位经过磁头时,读写磁头就可以感知到该位的值,也可以修改值。对磁盘的访问时间分为 寻道时间旋转时间以及传送时间

由于存储介质的特性,磁盘本身存取就比主存慢的多,再加上机械运动耗费,因此为了提高效率,要尽量减少磁盘I/O,减少读写操作。为了达到这个目的,磁盘往往不是严格按需读取,而是每次都会预读,即使只需要一个字节,磁盘也会从这个为止开始,顺序向后读取一定的数据放入内存。这样做的理论依据是计算机科学中著名的局部性原理

  • 当一个数据被用到时,其附近的数据也通常会马上被适用。由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此预读可以提高I/O效率。

页是计算机管理存储器的逻辑块,硬件及操作系统往往将主存和磁盘存储区分割成连续的大小相等的块,每个存储块称为一页(1024个字节或其整数倍),预读的长度一般位页的整数倍。主存和磁盘以页尾单位交换数据。当程序要读取的数据不在主存中时,就会触发一个缺页异常,此时系统会向磁盘发出读盘信号,磁盘会找到数据的起始位置并向后连续读取一页或几页数据载入内存中,任何异常返回,程序继续运行。

件系统的设计者利用了磁盘预读原理,将一个节点的大小设为等于一个页(1024个字节或其整数倍),这样每个节点只需要以此I/O就可以完全载入。那么3层的B树可以容纳1024*1024*1024差不多10亿个数据,如果换成二叉查找树,则需要30层!假定操作系统以此读取一个节点,并且根节点保留在内存中,那么B树在10亿个数据中查找目标值,只需要小于3次硬盘读取就可以找到目标值,但红黑树需要小于30次,因此B树大大提高了IO的操作效率。

2. B+树

B+树是对B树的一种变形树,它与B树的差异在于:

  1. 非叶节点仅具有索引作用,也就是说,非叶子节点只存储key,不存储value;
  2. 树的所有叶节点构成一个有序链表,可以按照key排序的次序遍历全部数据

2.1 B+树存储数据

若参数M选择为5那么每个节点最多包含4个键值对,我们以5阶B+树为例,看看B+树的数据存储过程

在这里插入图片描述

在这里插入图片描述

2.2 B+树和B树的对比

2.2.1 B+ 树的优点:(存储好,查找具有最坏情况)

  1. 由于B+ 树在非叶子节点上不包含真正的数据,只当作索引使用,因此在内存相同的情况下,能够存放更多的key
  2. B+ 树的叶子节点都是相连的,因此对整棵树的遍历只需要以此线性遍历叶子节点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层递归遍历。

2.2.2 B 树的优点:(存储比不过B+树,查找效率稳定)

由于B 树的每一个节点都包含key和value,因此我们根据key查找value时,只需要找到key所在的为止,就能找到value,但B+ 树只有叶子节点存储数据,索引每一次查找,都必须一次一次,一直找到树的最大深度,也就是叶子节点的深度,才能找到value

2.3 B+ 树在数据库中的应用

在数据库的操作中,查询操作可以说时最频繁的一种操作,因此在设计数据库时,必须要考虑到查询的效率问题,在很多数据库中,都是用到了B+树来提高查询的效率

在操作数据库时,我们为了提高查询效率,可以基于某张表的某个字段建立索引,就可以提高查询效率,那其实这个索引就是B+树这种数据结构实现的。

2.3.1 为建立主键索引查询

在这里插入图片描述

执行select * from user where id = 18,需要从第一条数据开始,一直查询到第六条,发现id=18,此时才能查询处目标结果,共需要比较6次。

2.3.2 建立主键索引查询

在这里插入图片描述

2.3.3 区间查询

执行select * from user where id>=12 and id<=18,如果有了索引,由于B+ 树的叶子节点形成了一个有序链表,所以我们只需要找到id为12的叶子节点,按照遍历链表的方式往后查询即可,效率非常高

3. 前置文章

  1. 浅入数据结构 “堆” - 实现和理论
  2. 开始熟悉 “二叉树” 的数据结构
  3. 队列 和 符号表 两种数据结构的实现
  4. 队列的进阶结构-优先队列
  5. 2-3树思想与红黑树的实现与基本原理

4. ES8 如何使用?

快来看看这篇好文章吧~~!!
😊👉(全篇详细讲解)ElasticSearch8.7 搭配 SpringDataElasticSearch5.1 的使用

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

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

相关文章

Hopfield神经网络求解旅行商问题(Traveling Salesman Problem,TSP),提供完整MATLAB代码,复制粘贴即可运行

Hopfield神经网络是以美国物理学家约翰霍普菲尔德&#xff08;John Hopfield&#xff09;的名字命名的。他在1982年提出了这种类型的神经网络模型&#xff0c;因此通常被称为Hopfield网络。Hopfield网络是一种早期的人工神经网络&#xff0c;具有以下特点&#xff1a; 递归连接…

【重磅升级】基于大数据的股票量化分析与预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 伴随全球经济一体化和我国经济的快速发展&#xff0c;中国股票市场对世界经济的影响力不断攀升&#xff0c;中国股市已成为全球第二大股票交易市场。在当今的金融市场中&#xff0c;股票价格的波动…

图像处理中常用的统计矩

目录 原点矩中心矩常用的统计矩偏度&#xff08;Skewness&#xff09;定义解释 峰度&#xff08;Kurtosis&#xff09;定义解释 统计矩的应用MATLAB相关函数 原点矩&#xff08;Moment about the Origin&#xff09;和中心矩&#xff08;Central Moment&#xff09;是概率论和数…

YOLOv11改进 | 融合篇,YOLOv11改进主干网络为MobileNetV3+CA注意机制

YOLOv11改进介绍 YOLOv11 跟 YOLOv8 结构差不多相似,只是作者在 YOLOv8 基础上进行了改进,我感觉 YOLOv11 训练速度更快,map和精度应该比 YOLOv8 高一些,所以我会把 YOLOv11 改进也写在本专栏里面。YOLOv11 改进,可以看往期 YOLOv8 改进主干网络教程,原理都是一样的,这…

【m6A】如何调节【免疫】,双热点如何碰撞出火花?

国自然已经放榜许久&#xff0c;【免疫】和【m6A】&#xff08;N6-甲基腺苷&#xff09;再次成为热门研究主题。m6A作为真核生物mRNA的主要表观遗传修饰之一&#xff0c;它通过调控mRNA的稳定性、剪接、运输和翻译等过程&#xff0c;进而影响基因的表达[1]。 图1.关键词【免疫、…

热烈祝贺!开利网络成为第一批广州市数据要素入库企业

今日&#xff0c;我们怀着无比激动的心情&#xff0c;热烈祝贺 广州市开利网络科技有限公司成为第一批广州市数据要素入库企业&#xff01;这一殊荣&#xff0c;是对 广州市开利网络科技有限公司在数据领域卓越表现的高度认可&#xff0c;更是 广州市开利网络科技有限公司发展历…

华为OD机试 - 排队游戏 刺头学生(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

动态规划lc

先找到规律&#xff0c;然后找边界情况&#xff1b;部分特殊情况分类讨论 *递归 70.爬楼梯 简单 提示 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 示例 1&#xff1a; 输入&#xff1a…

瑞芯微RK3566/RK3568 Android11使用OTA升级固件方法,深圳触觉智能鸿蒙开发板演示,备战第九届华为ICT大赛

本文介绍瑞芯微RK3566/RK3568在Android11系统OTA升级固件方法&#xff0c;使用触觉智能的Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566&#xff0c;Laval官方社区主荐&#xff01; 1、OTA包生成 在源码根目录上执行以下命令编译OTA包 # make installclean # …

效率提高——自动登录校园网(河海大学)与模拟点击与输入获取最新消息

文章目录 零、前言一、自动登录校园网1.1 快速锁定小工具1.2 版本问题1.3 出现进程未结束的情况1.4 关于chromedriver.exe1.5 打包ico图片格式 二、获取信息门户最新消息参考文章 零、前言 最近被校园网弄的也是比较烦心&#xff0c;而且准备远程弄弄这些玩具&#xff0c;为以…

150万条多语种音频数据!浙大清华发布语音伪造检测框架SafeEar,兼顾隐私保护,附代码和数据集

150万条多语种音频数据&#xff01;浙大清华发布语音伪造检测框架SafeEar&#xff0c;兼顾隐私保护&#xff0c;附代码和数据集. SafeEar是一种内容隐私保护的语音伪造检测方法&#xff0c;其核心是设计基于神经音频编解码器的解耦模型&#xff0c;分离语音声学与语义信息&…

服务器数据恢复—硬盘坏扇区导致Linux系统服务器数据丢失的数据恢复案例

服务器数据恢复环境&#xff1a; 一台linux操作系统网站服务器&#xff0c;该服务器上部署了几十个网站&#xff0c;使用一块SATA硬盘。 服务器故障&原因&#xff1a; 服务器在工作过程中突然宕机。管理员尝试重新启动服务器失败&#xff0c;于是将服务器上的硬盘拆下检测…

PostgreSQL数据库安全管理,细节都在这里了

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、My…

要求信创检测的项目验收中,验收依据有哪些?

一、验收依据和分类 验收依据&#xff1a; 通常包括立项批复文件以及经批复的项目建议书、可行性研究报告、业务需求说明书&#xff1b;正式设计文件&#xff1b;项目招标文件和采购文件&#xff1b;签订的项目合同或协议&#xff1b;经批准的项目变更文件&#xff1b;有关法…

出海快报 | “三消+短剧”手游横空出世,黄油相机“出圈”日本市场,从Q1看日本手游市场趋势和机会

编者按&#xff1a;TopOn出海快报栏目为互联网出海从业者梳理出海热点&#xff0c;供大家了解行业最新发展态势。 1.“三消短剧”横空出世&#xff0c;融合创新手游表现亮眼 随着竞争的加剧&#xff0c;新产品想要突出重围&#xff0c;只能在游戏中加入额外的元素。第一次打开…

vue使用js-xlsx导入本地excle表格数据,回显在页面上

效果图 解释放在代码的注释中 页面代码&#xff0c;导入本地文件我用的是element的上传工具 // 我是根据js文件直接引入的 <script src"/js/xlsx.full.min.js"></script>// 导入excelreadWorkbookFromLocalFile(fileData) {// 文件信息const file f…

智能生成ppt软件哪个好?如何高效生成ppt?

想要快速制作出专业且吸引人的PPT演示文稿吗&#xff1f;ai智能生成ppt工具可以帮你实现这一目标。 无需复杂的设计技巧&#xff0c;也不必花费大量时间&#xff0c;只需几个简单的步骤&#xff0c;就能创造出令人印象深刻的演示文稿。下面是一份免费版教程&#xff0c;让你轻…

中航资本:股票低佣开户注意事项,怎么低佣金开户?

股票生意中会涉及到一些手续费&#xff0c;佣金费、印花税、过户费等&#xff0c;印花税、过户费的费率是承认的&#xff0c;而不同证券公司、生意途径的佣金费率都有或许不同。 低佣金开户办法&#xff1a; 1、线上券商途径开户&#xff1a;许多大型证券公司&#xff0c;例如…

在HF上部署你的专属MindSearch,随时随地开启智能搜索!

作者&#xff1a;MindSearch 兴趣小组成员张富才 本文将详细带领大家学习如何在 Hugging Face Space 部署****并美化专属自己的 MindSearch 应用&#xff0c;免去排队等待的烦恼&#xff0c;随时随地开启智能搜索&#xff01; 在深入开始之前&#xff0c;我们需要了解&#x…

深入理解 C/C++ 指针

深入理解 C 指针&#xff1a;指针、解引用与指针变量的详细解析 前言 在 C 编程语言中&#xff0c;指针 是一个非常强大且重要的概念。对于初学者来说&#xff0c;指针往往会让人感到困惑不解。本文将通过形象的比喻&#xff0c;帮助大家深入理解指针、解引用与指针变量的概念…