当前位置: 首页 > news >正文

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树的默认填充策略通常是优先选择借用关键字的方式进行填充操作。

在这里插入图片描述

 

相关文章:

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

阿丹解读: B树(B tree)和B树(B-tree)都是常见的自平衡搜索树数据结构,用于在存储和检索大量数据时提供高效的操作。 基本概念-B树/B树 B树(B-tree)和B树(B tree&#x…...

go gin 自定义验证

我们上一篇已经提到了gin中binding时候可以指定json字段大小等限制,但是那个错误却是英文的,现在想搞成中文的,以便前端可读,demo如下 package mainimport ("net/http""reflect""github.com/gin-gonic/…...

掉了无数头发成地中海后,我整理出了这套40+的大屏模板,快收藏!

最近又有不少粉丝后台问我接不接做可视化大屏,看来可视化大屏是越来越火啦,但老李还是要说一下,老李本身工作就很忙,实在是顾不过来,但老李会在自己体验过后为大家挑选合适的工具和模板,提升大家做大屏的效…...

【从零开始学习JAVA | 第四十六篇】处理请求参数

前言: 在我们之前的学习中,我们已经基本学习完了JAVA的基础内容,从今天开始我们就逐渐进入到JAVA的时间,在这一大篇章,我们将对前后端有一个基本的认识,并要学习如何成为一名合格的后端工程师。今天我们介绍…...

k8s的交付与部署案例操作

一 k8s的概念 1.1 k8s k8s是一个轻量级的,用于管理容器化应用和服务的平台。通过k8s能够进行应用的自动化部署和扩容缩容。 1.2 k8s核心部分 1.prod: 最小的部署单元;一组容器的集合;共享网络;生命周期是短暂的; …...

LVS集群 (四十四)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、集群概述 1. 负载均衡技术类型 2. 负载均衡实现方式 二、LVS结构 三、LVS工作模式 四、LVS负载均衡算法 1. 静态负载均衡 2. 动态负载均衡 五、ipvsadm命令详…...

stm32之DS18B20

DS18B20与stm32之间也是通过单总线进行数据的传输的。单总线协议在DHT11中已经介绍过。虽说这两者外设都是单总线,但时序电路却很不一样,DS18B20是更为麻烦一点的。 DS18B20 举例(原码补码反码转换_原码反码补码转换_王小小鸭的博客-CSDN博客…...

Redis的数据结构与单线程架构

"飞吧,去寻觅红色的流星" Redis中的五种数据结构和编码 Redis是一种通过键值对关系存储数据的软件,在前一篇中,我们可以使用type命令实际返回当前键所对应的数据结构类型,例如: String\list\hash\set等等。 但…...

c# modbus CRC计算器(查表法)

一、简介: 本案例为crc计算器,通过查表法计算出结果 1.窗体后台源代码 using Crc; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text…...

2023.08.27 学习周报

文章目录 摘要文献阅读1.题目2.重点3.引言4.方法5.实验结果6.结论 深度学习Majorization-Minimization算法1.基本思想2.要求3.示意图 总结 摘要 This week, I read a computer science on the prediction of atmospheric pollutants in urban environments based on coupled d…...

css元素定位:通过元素的标签或者元素的id、class属性定位,还不明白的伙计,看这个就行了!

前言 大部分人在使用selenium定位元素时,用的是xpath元素定位方式,因为xpath元素定位方式基本能解决定位的需求。xpath元素定位方式更直观,更好理解一些。 css元素定位方式往往被忽略掉了,其实css元素定位方式也有它的价值&…...

基于Spring实现博客项目

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

数据库第十七课-------ETL任务调度系统的安装和使用

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…...

Qt 动态中英文切换

背景: 需要界面实现动态国际化,一键点击切换中英文或其他语言。 前提: 已经完成了整个界面的翻译,拿到匹配的ts翻译文件,注意:要保证界面切换后,翻译的全覆盖,要保证任何需要反应的地方,都用到了tr("")包含,不然Linguist会捕捉不到。.ts文件的生成参考下文…...

hdfs操作

hadoop fs [generic options] [-appendToFile … ] [-cat [-ignoreCrc] …] [-checksum …] [-chgrp [-R] GROUP PATH…] [-chmod [-R] <MODE[,MODE]… | OCTALMODE> PATH…] [-chown [-R] [OWNER][:[GROUP]] PATH…] [-copyFromLocal [-f] [-p] [-l] [-d] … ] [-copyTo…...

h5分享页适配手机电脑

实现思路 通过media媒体查询结合rem继承html文字大小来实现。 快捷插件配置 这里使用了VSCode的px to rem插件。 先在插件市场搜索cssrem下载插件&#xff1b; 配置插件 页面编写流程及适配详情 配置meta h5常用配置信息:<meta name"viewport" content&quo…...

崭新商业理念:循环购模式的价值引领-微三云门门

尊敬的创业者们&#xff0c;我是微三云门门&#xff0c;今天我将为您详细探讨一种具有颠覆性的商业模式——循环购模式。这套私域流量裂变策略在实际应用中取得了巨大的成功&#xff0c;某些企业在短短6个月内迅速积累了400万用户&#xff01; 循环购商业模式的核心聚焦于三个…...

二级MySQL(二)——编程语言,函数

SQL语言又称为【结构化查询语言】 请使用FLOOR&#xff08;x&#xff09;函数求小于或等于5.6的最大整数 请使用TRUNCATE&#xff08;x&#xff0c;y&#xff09;函数将数字1.98752895保留到小数点后4位 请使用UPPER&#xff08;&#xff09;函数将字符串‘welcome’转化为大写…...

python爬虫12:实战4

python爬虫12&#xff1a;实战4 前言 ​ python实现网络爬虫非常简单&#xff0c;只需要掌握一定的基础知识和一定的库使用技巧即可。本系列目标旨在梳理相关知识点&#xff0c;方便以后复习。 申明 ​ 本系列所涉及的代码仅用于个人研究与讨论&#xff0c;并不会对网站产生不好…...

系列十三、idea创建文件自动生成作者信息

File>Settings>Editor>File and Code Templates>Includes>File Header /*** Author : 一叶浮萍归大海* Date: ${DATE} ${TIME}* Description: */...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...

学习一下用鸿蒙​​DevEco Studio HarmonyOS5实现百度地图

在鸿蒙&#xff08;HarmonyOS5&#xff09;中集成百度地图&#xff0c;可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API&#xff0c;可以构建跨设备的定位、导航和地图展示功能。 ​​1. 鸿蒙环境准备​​ ​​开发工具​​&#xff1a;下载安装 ​​De…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

基于Python的气象数据分析及可视化研究

目录 一.&#x1f981;前言二.&#x1f981;开源代码与组件使用情况说明三.&#x1f981;核心功能1. ✅算法设计2. ✅PyEcharts库3. ✅Flask框架4. ✅爬虫5. ✅部署项目 四.&#x1f981;演示效果1. 管理员模块1.1 用户管理 2. 用户模块2.1 登录系统2.2 查看实时数据2.3 查看天…...