Mysql--技术文档--B树-数据结构的认知

阿丹解读:

        B+树(B+ tree)和B树(B-tree)都是常见的自平衡搜索树数据结构,用于在存储和检索大量数据时提供高效的操作。

基本概念-B+树/B树

B树(B-tree)和B+树(B+ tree)是常见的自平衡搜索树数据结构,用于在存储和检索大量数据时提供高效的操作。它们具有一些共同的基本概念:

  1. 节点(Node):B树和B+树的数据存储在节点中。节点可以包含多个关键字和对应的指针。在B树中,叶子节点和内部节点的结构相同,都存储数据和关键字。而在B+树中,叶子节点只存储关键字和指向数据的指针,而内部节点存储关键字和指向子节点的指针。

  2. 关键字(Key):关键字是B树和B+树中用于对数据进行排序和搜索的值。关键字按照升序排列,并被存储在节点中。

  3. 指针(Pointer):指针用于连接节点,形成树的结构。在B树和B+树中,指针可以指向子节点、父节点或兄弟节点,实现树的平衡。

  4. 根节点(Root Node):根节点是B树和B+树的顶层节点。它是树的起点,通过根节点可以访问到整个树的结构。

  5. 叶节点(Leaf Node):叶节点是树的最底层节点。在B树中,叶节点存储数据和关键字。而在B+树中,叶节点只存储关键字和指向数据的指针。叶节点之间通过指针进行连接,形成一个有序的双向链表。

  6. 内部节点(Internal Node):内部节点是B树和B+树中非叶节点。它们用于指向子节点,并存储关键字。

B树和B+树作为自平衡的搜索树,具有增删改查的操作,每次操作后都会进行平衡以保持树的高度接近最小值。这样可以确保查询效率的稳定性,并提供高效的范围查询和区间搜索能力。

以上是B树和B+树的基本概念,它们在实际应用中有着广泛的应用,尤其在数据库和文件系统中用于管理和查找大量数据。

B树

B树(B-tree)是一种自平衡的搜索树数据结构,被广泛应用于数据库和文件系统等领域。它具有高效的查找、插入和删除操作,适合在磁盘上存储和检索大量数据。

B树的工作原理如下:

  1. 根节点:B树的顶层节点称为根节点。根节点可以有多个子节点,且关键字的数量和子节点的数量相等。

  2. 关键字有序存储:在B树中,节点内的关键字按照升序排列,并且关键字的数量决定了节点的最大容量。

  3. 节点分裂:当往一个节点插入关键字时,如果节点已满,将会进行分裂。分裂会将关键字分为两部分,并生成两个新节点。

  4. 子节点指针:除了关键字,节点还会存储指向子节点的指针。子节点指针的数量比关键字的数量多一个。

通过上述原理,B树可以实现快速的查找、插入和删除操作。

B树的性能优点包括:

  1. 减少磁盘访问:B树的节点尺寸一般较大,可以容纳更多的关键字。这样可以减少磁盘IO的次数,提高数据读写的效率。

  2. 平衡性:B树会在插入和删除操作后进行节点的自平衡,使树的高度保持相对较小。这样可以保持查询效率的稳定性。

  3. 范围查询:由于B树中的关键字有序存储,范围查询和区间搜索变得高效。可以通过节点的查找和遍历实现范围查询。

  4. 适应多层存储:B树的设计使其适用于多层存储系统,如内存和磁盘。节点的容量可以根据不同层级的存储进行调整,适应不同的场景。

需要注意的是,B树的具体性能表现会受到节点容量、节点分裂策略和具体实现等因素的影响。在实际应用中,可以根据具体的需求和场景选择合适的B树参数和配置,以获得更好的性能和效果。

B树的复杂度

平均最差
空间复杂度O(n)O(n)
搜索O(log n)O(log n)
插入O(log n)O(log n)
删除O(log n)O(log n)

B树工作流程

提供一个网址可手动看见树的工作流程

B-Tree Visualization

流程图

树结构专题(三) B树

 详解工作流程

查找

流程描述:

  1. 从根节点开始,在当前节点中查找是否存在目标关键字。如果存在,查找成功并返回相应的数据。

  2. 如果目标关键字小于当前节点的最小关键字,则转到该节点的最左子节点进行下一步查找。

  3. 如果目标关键字大于当前节点的最大关键字,则转到该节点的最右子节点进行下一步查找。

  4. 如果目标关键字在当前节点关键字的范围内(大于等于最小关键字且小于等于最大关键字),则根据关键字的大小选择合适的子节点,并进入下一层继续查找。

  5. 重复以上步骤,直到在某个叶子节点中找到目标关键字,或者在某个节点中无法找到目标关键字。

图示流程:

插入

插入代码需要根据具体情况来进行拆分

单层容量满需要分裂

当插入元素后发现元素已经超过了阶数,则需要向上拆分

在B树中,当插入元素导致某层节点的容量已满时,需要进行节点的分裂操作。分裂操作会将该节点的关键字分为两部分,并生成两个新节点。拆分的规则如下:

  1. 拆分关键字:假设插入前节点中的关键字按升序排列,在容量已满的节点中,将关键字分为两部分。前一部分的关键字留在原节点,后一部分的关键字移至新节点。通常,中间位置的关键字作为拆分点,可以平均分配关键字给两个新节点。

  2. 更新指针:拆分节点后,需要更新相关的指针。对于内部节点,拆分后,新节点的关键字会大于原节点中的所有关键字,将新节点的指针链接到原节点的右侧。对于叶子节点,拆分后,新节点将成为原节点的右兄弟节点,并与原节点进行指针连接。

  3. 提升拆分点:当拆分点是根节点中的关键字时,拆分后的两个新节点会成为新的根节点,原根节点的指针指向这两个新节点。

通过上述规则,B树在容量已满时进行节点的分裂,以维持树的平衡性。拆分后,树的高度可能增加,但通过平衡操作可以保持树的高度接近最小值。

在这里插入图片描述

多层容量满需要分裂

当多层层次的节点容量满时,B树在插入操作时的流程如下:

  1. 从根节点开始,在当前节点中查找插入位置。如果要插入的关键字已经存在,可能会更新相应的数据,否则,将关键字插入到当前节点。

  2. 如果当前节点已满,进行节点的分裂操作。拆分的规则如前面所述,将关键字分为两部分,并生成两个新节点。对于内部节点,拆分后,新节点的关键字会大于原节点中的所有关键字,将新节点插入到原节点父节点的相应位置。对于叶子节点,拆分后,新节点将成为原节点的右兄弟节点,并进行指针的连接。

  3. 分裂操作可能会导致上层节点容量变满,需要再次进行分裂。如果分裂的节点是根节点,将生成新的根节点,并将原根节点作为新根节点的子节点。

  4. 重复以上步骤,不断向上进行节点的分裂操作,直到遇到非满节点或者根节点。

  5. 如果根节点满了,进行根节点的分裂,并生成新的根节点。根节点分裂会导致B树的高度增加,但也保持了树的平衡。

重点:从顶向下进行分裂!!!

整体插入流程图

 删除

删除有两个相关的基本操作:合并和填充

合并操作:是值将两个子节点合并为一个子节点;

填充操作:指删除元素后,当一个节点中元素个数小于最小元素个数时,需要向此节点中填充元素。在填充操作的时候需要调用合并操作。

合并操作流程:

  1. 找到需要合并的两个相邻子节点。

  2. 选择一个关键字从父节点中下来填充合并后的子节点。这个关键字可以是两个相邻子节点之间的父节点关键字,或者是子节点中的一个关键字。

  3. 将两个子节点中的关键字和指针合并到一个新的子节点中。合并后的子节点将成为原两个子节点的父节点连接的子节点。

  4. 更新父节点的关键字和指针,将被合并的子节点移除,并将合并后的子节点添加到父节点中。

  5. 如果父节点关键字数量小于最小关键字数量,可能需要继续进行合并操作,直到满足平衡条件。

通过合并操作,B树可以保持平衡性,并保证树的高度接近最小值。当删除一个关键字导致节点关键字数量不满足要求时,合并操作可以将多个子节点合并为一个节点,减少节点数量以提高空间利用率。

图示:

 删除操作流程:

B树的删除工作流程如下:

  1. 从根节点开始,在当前节点中查找要删除的关键字。如果关键字存在于当前节点,则执行删除操作。

  2. 如果要删除的关键字在当前节点中不存在,根据关键字的大小选择合适的子节点,并进入下一层继续查找与删除操作。

  3. 如果要删除的关键字在叶子节点中找到,直接删除该关键字。

  4. 如果要删除的关键字在内部节点中找到,则可以选择使用前驱或后继关键字代替要删除的关键字。一般情况下,选择后继关键字进行替换。

  5. 如果替换后的关键字所在的节点关键字数量小于最小关键字数量,则可能需要进行合并和填充操作,以保持树的平衡。

  6. 合并操作:如果替换后的关键字所在的节点的兄弟节点关键字数量大于最小关键字数量,可以选择从兄弟节点中借一个关键字过来,或者进行合并操作。

  7. 填充操作:如果替换后的关键字所在的节点的兄弟节点关键字数量也小于等于最小关键字数量,则可能需要进行填充操作。填充操作可能需要借一个关键字过来,或者通过合并操作将当前节点与兄弟节点合并。

  8. 重复以上步骤,直到在某个叶子节点中找到要删除的关键字,或者确定不存在要删除的关键字。

通过上述流程,B树可以实现删除操作,并保持树的平衡和性能。删除操作可能会触发合并和填充操作,以优化节点的利用率和树的结构。需要注意的是,B树的删除操作可以涉及多次的合并和填充操作,以保持树的平衡。

重点概念与流程:

合并操作:

在B树中,合并操作是指将两个子节点合并为一个子节点的操作。当一个节点中的关键字数量小于最小关键字数量时,可以执行合并操作。

合并操作的工作流程如下:

  1. 找到需要合并的两个相邻子节点。

  2. 选择一个关键字从父节点中下来填充合并后的子节点。这个关键字可以是两个相邻子节点之间的父节点关键字,或者是子节点中的一个关键字。

  3. 将两个子节点中的关键字和指针合并到一个新的子节点中。合并后的子节点将成为原两个子节点的父节点连接的子节点。

  4. 更新父节点的关键字和指针,将被合并的子节点移除,并将合并后的子节点添加到父节点中。

  5. 如果父节点关键字数量小于最小关键字数量,可能需要继续进行合并操作,直到满足平衡条件。

通过合并操作,B树可以保持平衡性,并保证树的高度接近最小值。当删除一个关键字导致节点关键字数量不满足要求时,合并操作可以将多个子节点合并为一个节点,减少节点数量以提高空间利用率。

合并策略:

在B树中,合并操作的合并策略通常有以下几种:

  1. 左兄弟合并:首先尝试将当前节点与其左兄弟节点进行合并。合并后,当前节点的关键字会被移动到左兄弟节点,并与左兄弟节点的关键字合并。这种合并策略会保持原有节点的顺序性。

  2. 右兄弟合并:如果左兄弟合并失败或左兄弟节点不存在,可以尝试将当前节点与其右兄弟节点进行合并。合并后,当前节点的关键字会被移动到右兄弟节点,并与右兄弟节点的关键字合并。这种合并策略同样会保持原有节点的顺序性。

  3. 中间位置合并:如果左兄弟合并和右兄弟合并都失败或兄弟节点不存在,可以考虑合并两个相邻的子节点中的中间位置的关键字。该关键字可以是父节点关键字中的一个,或者是两个子节点中的某个关键字。此合并策略可能会调整节点的顺序性,因为中间关键字可能会被移动到新的合并节点中。

通过以上合并策略,可以选择合适的方式将两个子节点合并为一个节点。合并操作会减少B树中的节点数量以提高空间利用率,同时还有助于保持树的平衡性。

B树的默认合并策略通常会优先选择左兄弟合并或右兄弟合并

填充操作:

填充操作的流程如下:

  1. 在进行填充操作之前,需要先确定当前节点关键字数量小于最小关键字数量,并确定要进行填充的节点。

  2. 首先查找当前节点的兄弟节点,找出关键字数量大于最小关键字数量的兄弟节点。

  3. 如果存在兄弟节点,可以选择从兄弟节点中借一个关键字过来填充当前节点。这可以通过从兄弟节点中移动一个关键字和相应的指针到当前节点来实现。

  4. 更新父节点的关键字和指针,以及兄弟节点的关键字和指针,完成填充操作。

  5. 如果不存在关键字数量大于最小关键字数量的兄弟节点,则可能需要进行合并操作。合并操作可以将当前节点与兄弟节点合并为一个节点。

  6. 合并操作可能涉及到移动关键字和指针,同时更新父节点的关键字和指针。

  7. 重复以上步骤,直到满足平衡条件或达到根节点。

填充策略:

B树中的填充操作的策略通常有以下几种:

  1. 借用关键字:如果存在关键字数量大于最小关键字数量的兄弟节点,可以选择从兄弟节点中借用一个关键字过来填充当前节点。

  2. 合并节点:如果没有关键字数量大于最小关键字数量的兄弟节点,可以选择合并当前节点和兄弟节点为一个节点。

B树的默认填充策略通常是优先选择借用关键字的方式进行填充操作。

在这里插入图片描述

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

checkstyle检查Java编程样式:final参数

checkstyle可以利用FinalParameters检查方法、构造器、catch和for-each块的参数是final的: https://checkstyle.sourceforge.io/checks/misc/finalparameters.html 背后的原理:程序执行期间修改参数的值会引起混乱,所以应该避免。 要配置使…

MybatisPlus核心功能

文章目录 一、前言二、核心功能2.1、条件构造器2.1.1、基础查询条件2.1.2、复杂查询条件2.1.3、动态查询条件2.1.4、查询结果排序2.1.5、执行查询 2.2、主键策略2.2.1、自增主键策略2.2.2、UUID 主键策略2.2.3、雪花算法主键策略2.2.4、自定义 ID 生成策略 三、总结 一、前言 …

Vscode画流程图

1.下载插件 Draw.id Integration 2.桌面新建文件,后缀名改为XXX.drawio 在vscode打开此文件 ,就可以进行绘制流程图啦

智能工厂移动式作业轻薄加固三防平板数据采集终端

在这个高度自动化和数字化的环境中,数据采集变得尤为重要。为了满足这个需求,工业三防平板数据采集终端应运而生。工业三防平板数据采集终端采用了轻量级高强度镁合金材质,这使得它在保持轻薄的同时具有更强的坚固性。这种材质还具有耐磨防损…

Ubuntu20.04配置mysql配置主从复制

ubuntu20.04:mysql主库 sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf # 修改完毕重启 sudo service mysql stop sudo service mysql start主库mysqld.cnf配置 [mysqld] ... # bind-address>->--- 127.0.0.1 # 注释掉,允许外部连接 # mysqlx-b…

【Android】TextView适配文本大小并保证中英文内容均在指定的UI 组件内部

问题 现在有一个需求&#xff0c;在中文环境下textView没有超过底层的组件限制&#xff0c;但是一切换到英文环境就超出了&#xff0c;这个如何解决呢&#xff1f;有啥例子吗&#xff1f; 就像这样子的。 解决 全部代码如下&#xff1a; <?xml version"1.0"…

rust交叉编译 在mac下编译linux和windows

系统版本macbook proVentura 13.5linux ubuntu22.04.3 LTS/18.04.6 LTSwindowswindows 10 专业版 20H2mac下rustc --versionrustc 1.74.0-nightly (58eefc33a 2023-08-24)查看当前系统支持的交叉编译指定系统版本列表 rustup target list如果已经安装这里会显示(installed)。…

Elasticsearch中倒排索引、分词器、DSL语法使用介绍

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

Spring Cloud Nacos 和 Eureka区别,包含实战代码

目录 一、Spring Cloud Eureka详解二、Spring Cloud Nacos详解三、Spring Cloud Nacos和Eureka区别 Spring Cloud Nacos 和 Spring Cloud Eureka 都是 Spring Cloud 微服务框架中的服务注册和发现组件&#xff0c;用于帮助开发者轻松地构建和管理微服务应用。它们之间的主要区别…

pytestx容器化执行引擎

系统架构 前端、后端、pytest均以Docker容器运行服务&#xff0c;单独的容器化执行引擎&#xff0c;项目环境隔离&#xff0c;即用即取&#xff0c;用完即齐&#xff0c;简单&#xff0c;高效。 前端容器&#xff1a;页面交互&#xff0c;请求后端&#xff0c;展示HTML报告 后…

RHCE——十一、NFS服务器

NFS服务器 一、简介1、NFS背景介绍2、生产应用场景 二、NFS工作原理1、示例图2、流程 三、NFS的使用1、安装2、配置文件3、主配置文件分析3.1 实验1 4、NFS账户映射4.1 实验24.2 实验3 四、autofs自动挂载服务1、产生原因2、安装3、配置文件分析4、实验45、实验5 一、简介 1、…

归一化的作用,sklearn 安装

目录 归一化的作用&#xff1a; 应用场景说明 sklearn 准备工作 sklearn 安装 sklearn 上手 线性回归实战 归一化的作用&#xff1a; 归一化后加快了梯度下降求最优解的速度; 归一化有可能提高精度(如KNN) 应用场景说明 1&#xff09;概率模型不需要归一化&#xff…

FusionAD:用于自动驾驶预测和规划任务的多模态融合

论文背景 自动驾驶&#xff08;AD&#xff09;任务通常分为感知、预测和规划。在传统范式中&#xff0c;AD中的每个学习模块分别使用自己的主干&#xff0c;独立地学习任务。 以前&#xff0c;基于端到端学习的方法通常基于透视视图相机和激光雷达信息直接输出控制命令或轨迹…

基于Spring实现博客项目

访问地址:用户登录 代码获取:基于Spring实现博客项目: Spring项目写博客项目 一.项目开发 1.项目开发阶段 需求评审,需求分析项目设计(接口设计,DB设计等&#xff0c;比较大的需求,需要设计流程图&#xff0c;用例图,UML, model中的字段)开发&#xff0b;自测提测(提交测试…

深入浅出SSD:固态存储核心技术、原理与实战(文末赠书)

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 内容简介 作者简介 使用Python做一个计算器 本期赠书 近年来国家大力支持半导体行业&#xff0…

计算机视觉与人工智能在医美人脸皮肤诊断方面的应用

一、人脸皮肤诊断方法 近年来&#xff0c;随着计算机技术和人工智能的不断发展&#xff0c;中医领域开始逐渐探索利用这些先进技术来辅助面诊和诊断。在皮肤望诊方面&#xff0c;也出现了一些现代研究&#xff0c;尝试通过图像分析技术和人工智能算法来客观化地获取皮肤相关的…

循环购商业模式:提升复购率与用户价值的创新策略-微三云门门

亲爱的企业家们&#xff0c;我是微三云门门&#xff01;今天&#xff0c;我将为大家详细介绍一种颠覆性的商业模式&#xff1a;循环购商业模式。这个模式不仅可以帮助企业提升平台的复购率&#xff0c;还能够拉新用户并提升用户的消费率。让我们一起深入了解这个引人注目的商业…

Ubuntu 下安装Qt5.12.12无法输入中文解决方法

Ubuntu 下安装Qt5.12.12无法输入中文解决方法 一&#xff0c;环境&#xff1a; &#xff08;1&#xff09;VMware Workstation 15 Pro &#xff08;2&#xff09;Ubuntu 20.04 &#xff08;3&#xff09;Qt 5.12.12 64bits &#xff08;4&#xff09;Qt Creator 5.0.2 &#…

Hadoop Yarn 核心调优参数

文章目录 测试集群环境说明Yarn 核心配置参数1. 调度器选择2. ResourceManager 调度器处理线程数量设置3. 是否启用节点功能的自动检测设置4. 是否将逻辑处理器当作物理核心处理器5. 设置物理核心到虚拟核心的转换乘数6. 设置 NodeManager 使用的内存量7. 设置 NodeManager 节点…

ant-vue1.78版a-auto-complete表单自动搜索返回列表中的关键字标红

a-auto-complete表单自动搜索返回列表中的关键字标红 通常在做关键字标红的场景&#xff0c;都是后端返回html结构&#xff0c;前端直接渲染实现&#xff0c;但是如果需要前端处理的话&#xff0c;实现也是很简单的&#xff0c;接下来我直接上应用场景吧 应用场景就是通过关键…