数据结构和算法之树形结构B+树(7)

前一章节我们介绍了B树,了解了B树适用于大规模数据存储和磁盘访问‌的树结构,而今天要讲的B+是B树的一种改进,是B树的一种优化和改进,被大多数据库系统采纳作为索引结构使用。

一、基本概念  
   
B+树是B树的改进,因而同样是一种自平衡的多叉树,它更适用于数据库索引。其基本特征如下图表:

图片

  一棵正常的B+树,如下图:

图片

二、B+树的查找

     B+树中的所有数据均保存在叶子节点,且根结点和内部节点均只是充当控制查找记录的媒介,并不代表数据本身,所有的内部节点关键字都同时存在于子节点中,是子节点关键字中是值最大(或最小)的。例如在上图中的B+树中查找55这个关键字,步骤如下:

     1.在根节点中对比55和根节点中的元素[60, 85],发现55<60,因此应该在第一个节点中继续寻找;

  2.同理,比较55和第一个节点中的元素[10, 20, 50, 60],发现50<55<60,因此55应该存在于第四个结点当中;

    3.继续对比55和第四个结点中的元素[55, 60],找到55,查找成功。当然,也有查找失败的情况,即要查找的元素并不在B+树中。

三、B+树的插入

B+树的插入和B树十分相似,其插入规则如下:. 插入的操作全部都在叶子节点上进行,且不能破坏关键字自小而大的顺序;

2.  当插入关键字后节点的关键字个数大于m,需要进行“分裂”。

    B+树的插入有四种情况:

1. 若被插入关键字所在的节点,其含有关键字数目小于m,则直接插入;
2. 若被插入关键字所在的节点,其含有关键字数目等于m,则需要将这个节点分为左右两部分,中间的节点放到父节点中。假设其双亲结点中包含的关键字个数小于m,则插入操作完成。
3. 在第2种情况中,如果上移操作导致其双亲节点中关键字个数大于m,则应继续分裂其双亲节点。
4. 若插入的关键字比当前节点中的最大值还大,破坏了B+树中从根节点到当前节点的所有索引值,此时需要及时修正后,再做其他操作。

   
 
四、B+树的删除

     B+树的删除也和B树十分类似,它同样有下面几种情况:

1. 找到存储有该关键字所在的节点时,由于该节点中关键字个数>=⌈m/2⌉,做删除操作不会破坏B+树,则可以直接删除;
2. 当删除某节点中最大或者最小的关键字,就会涉及到更改其双亲节点一直到根节点中所有索引值的更改。
3. 当删除该关键字,导致当前节点中关键字个数小于 ⌈m/2⌉,若其兄弟节点中含有多余的关键字,可以从兄弟节点中借关键字完成删除操作。
4. 第3种情况中,如果其兄弟节点没有多余的关键字,则需要同其兄弟节点进行合并;当进行合并时,可能会产生因合并使其双亲节点破坏 B+树的结构,需要依照以上规律处理其双亲节点。


五、B+树和B树的区别

从以上图表可以看出,B树和B+树的差异主要有以下几点:

图片

B+ 树的优点在于:

1.由于B+树在非叶子点上不包含真正的数据,只当做索引使用,因此在内存相同的情况下,能够存放更多的key。

2.B+树的叶子点都是相连的,因此对整棵树的遍历只需要一次线性遍历叶子点即可。而且由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。

B树的优点在于:

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

六、B+树在数据库中的应用

    在数据库的操作中,查询操作可以说是最频繁的一种操作,因此在设计数据库时,必须要考虑到查询的效率问题,在很多数据库中,都是用到了B+树来提高查询的效率;在操作数据库时,我们为了提高查询效率,可以基于某张表的某个字段建立索引,就可以提高查询效率,那其实这个索引就是B+树这种数据结构实现的。

      未建立主键索引查询

图片

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

       建立主键索引查询

图片

区间查询

执行 select * from user where id=18 ,所以我们只需要找到id为12的叶子节点,然后按照遍历链表的方式顺序往后查即可,效率非常高。

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

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

相关文章

用 Python 爬取淘宝商品价格信息时需要注意什么?

用 Python 爬取淘宝商品价格信息时&#xff0c;需要注意以下方面&#xff1a; 一、法律和道德规范&#xff1a; 遵守法律法规&#xff1a;网络爬虫的行为应在法律允许的范围内进行。未经淘宝平台授权&#xff0c;大规模地爬取其商品价格信息并用于商业盈利等不当用途是违法的…

基于Python的自然语言处理系列(50):Soft Prompt 实现

在本篇文章中,我们将实现一个简单的 Soft Prompt 技术,该技术允许我们仅微调新增的嵌入权重,而保持预训练模型不变。Soft Prompt 的主要优势在于它的参数高效性,使得模型在特定任务上快速适应,而无需重新训练模型的所有权重。 1. Soft Prompt 概述 Soft Prompt 技术来源于…

stack和queue --->容器适配器

不支持迭代器&#xff0c;迭代器无法满足他们的性质 边出边判断 实现 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<stack> #include<queue> using namespace std; int main() {stack<int> st;st.push(1);st.push(2);st.push(3);…

UE5 材质篇 1 如何偏移顶点

顶点偏移 start content里的plane长这样 我们进行一点顶点偏移就能长这样 XY加起来乘个缩放系数扔给sin结果乘个缩放系数即可

MySQL45讲 第十六讲 “order by”是怎么工作的?

文章目录 MySQL45讲 第十六讲 “order by”是怎么工作的&#xff1f;一、引言二、全字段排序&#xff08;一&#xff09;索引创建与执行情况分析&#xff08;二&#xff09;执行流程&#xff08;三&#xff09;查看是否使用临时文件 三、rowid 排序&#xff08;一&#xff09;参…

Ansys HFSS:外壳的屏蔽效果演示

欢迎回来&#xff01;随着电子系统变得越来越复杂和集成&#xff0c;确保适当的屏蔽以减轻电磁干扰 &#xff08;EMI&#xff09; 变得越来越重要。 继续讨论屏蔽效果&#xff0c;我们现在将重点转移到另一个强大的工具上&#xff1a;Ansys HFSS&#xff08;高频结构仿真器&am…

无人机避障——(局部规划方法)DWA(动态窗口法)

传统的DWA算法更加倾向于车辆等差速无人车&#xff0c;旋翼无人机是全速的&#xff0c;全向的。 全局路径是通过A*算法生成的 局部路径规划效果&#xff1a; DWA算法效果&#xff1a; 过程图&#xff1a; 完整过程&#xff1a; PID算法效果&#xff1a; 过程图&#xff1a…

数据库->视图

目录 一、视图 1.什么是视图 ​编辑 2.创建视图 1.语法 3.使用视图 4.视图的功能 1.屏蔽相关字段 2.对外提供统一访问规范 3.视图和真实表进行表连接查询 5.修改数据 6.注意事项 7.删除视图 1.语法 8.视图的优点 1. 简单性 2. 安全性 3. 逻辑数据独⽴性 4. 重…

el-scrollbar 动态更新内容 鼠标滚轮无效

有以下功能逻辑&#xff0c;实现了一个时间轴组件&#xff0c;点击、-号后像地图那样放大组件以显示不同的UI。 默认显示年月&#xff1a; 当点击一下加号时切换为年&#xff1a; 当点击减号时切换为日&#xff1a; 即加号、减号点击就是在年月日显示进行切换。给Scrollvie…

动态ip如何自动更换ip

在探讨如何自动更换动态IP地址时&#xff0c;我们首先需要理解动态IP的基本概念。IP地址&#xff0c;即互联网协议地址&#xff0c;分配给每台连接到互联网的设备的唯一标识符。与传统静态IP地址不同&#xff0c;动态IP地址是由网络服务提供商&#xff08;ISP&#xff09;动态分…

关于金属氢化物(储氢)PCT曲线拟合、ZBS有效导热系数模型、JMAK类型吸放氢动力学方程的笔记

参考文献&#xff1a;Experimental and numerical study of metal hydride beds with Ti0.92Zr0.10Cr1.0Mn0.6Fe0.4 alloy for hydrogen compressionhttps://www.sciencedirect.com/science/article/pii/S1385894723043851?via%3Dihub#s0010 一、PCT曲线拟合 根据以下文献内容…

力扣最热一百题——验证二叉搜索树

目录 题目链接&#xff1a;98. 验证二叉搜索树 - 力扣&#xff08;LeetCode&#xff09; 题目描述 示例 提示&#xff1a; 二叉搜索树的要求 解法一&#xff1a;采用中序遍历 中序遍历的定义 为什么二叉搜索树的中序遍历是严格递增的 二叉搜索树&#xff08;BST&#x…

如何无缝更换WordPress主题:关键步骤详解

更换WordPress主题对于希望刷新网站外观或改善用户体验的站长来说&#xff0c;是一项常见但不容忽视的任务。无论是为了提升性能还是实现新的设计风格&#xff0c;在更换主题时&#xff0c;确保不遗漏任何重要细节至关重要。本文将详细介绍更换WordPress主题的关键步骤&#xf…

科技改变阅读习惯:最新研究揭示电子阅读器的普及趋势

据QYResearch调研团队最新报告“全球电子阅读器市场报告2023-2029”显示&#xff0c;预计2029年全球电子阅读器市场规模将达到6.9亿美元&#xff0c;未来几年年复合增长率CAGR为0.4%。 如上图表/数据&#xff0c;摘自QYResearch最新报告“全球电子阅读器市场研究报告2023-2029.…

ServletContext 对象介绍

文章目录 1、ServletContext对象介绍1_方法介绍2_用例分析 2、ServletContainerInitializer1_整体结构2_工作原理3_使用案例 3、Spring案例源码分析1_注册DispatcherServlet2_注册配置类3_SpringServletContainerInitializer 4_总结 ServletContext 表示上下文对象&#xff0c;…

高频面试题(含笔试高频算法整理)基本总结回顾48

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

yolov8涨点系列之引入CBAM注意力机制

文章目录 YOLOv8 中添加注意力机制 CBAM 具有多方面的好处特征增强与选择通道注意力方面空间注意力方面 提高模型性能计算效率优化&#xff1a; yolov8增加CBAM具体步骤CBAM代码(1)在__init.pyconv.py文件的__all__内添加‘CBAM’(2)conv.py文件复制粘贴CBAM代码(3)修改task.py…

python实现tkinter解密剧情文本游戏

目录 需求 效果 代码实现 代码说明 需求 python实现tkinter解密剧情文本游戏 效果 代码实现 import tkinter as tkclass StoryGame:def __init__(self, master):self.master mastermaster.title("剧情游戏")# 初始化故事节点self.current_node 0# 故事节点数…

C 学习(5)

哈哈哈哈哈&#xff0c;终于想起来了&#xff01;贴一下主要的参考&#xff1a; 基本语法 - 《阮一峰《C 语言教程》》 - 书栈网 BookStack 内容写的比较浅显有疏漏&#xff0c;如果看不明白&#xff0c;再结合一下百度。 注释 C 语言的注释有两种表示方法。 第一种方法是…

解读《ARM Cortex-M3 与Cortex-M4 权威指南》——第3章 技术综述

加载—存储架构 ISA(指令集架构) 指令集架构 (ISA) 是计算机处理器能够理解和执行的指令集合。它定义了计算机系统中硬件和软件之间的接口 ISA 是硬件与软件之间的接口规范,它定义了处理器能执行哪些操作,程序员和编译器可以依此编写代码。 常见的 ISA 类型: CISC (Comp…