B-树(不是B减树)原理剖析(1)

news2024/10/2 22:30:58

目录

B树的主要特性:

B树的操作:

B树的优点:

为什么要发明出B-树?

B树的概念和原理剖析

原理图讲解(部分讲解在图中)

初始化结点:

处理数据数量计算(了解)

底层代码实现(加深理解)


前些日子我们学了AVl树,红黑树感受到了搜索树在底层和实际应用的广泛和其规则的复杂性,今天我们继续学习一下原理也是搜索树的B-树。

B树是一种自平衡的树数据结构,常用于实现数据库和文件系统的索引。它的设计目的是保持数据有序,并允许高效的插入、删除和搜索操作。B树的特点是它的节点可以包含多个子节点,而不是像二叉树那样每个节点只有两个子节点。这样可以减少树的高度,从而减少查找和更新操作的时间复杂度。

B树的主要特性:

  1. 有序性:B树中的所有节点按升序排列,这使得查找非常高效。每个节点包含一个键值的有序列表,以及指向其子节点的指针。

  2. 多子节点:与二叉树不同,B树中的每个节点可以有多个子节点。节点中的键值和子节点之间有一定的关系:子节点中的值总是介于父节点键值之间。

  3. 平衡性:B树是平衡树,它通过在插入和删除时重新分布节点的键值,确保树的所有叶节点都位于同一层级上。因此,查找的时间复杂度始终为 O(log n),其中 n 是树中的键值总数。

  4. 分支因子:B树的分支因子(通常称为阶数,order)决定了每个节点可以有多少个子节点。一个阶数为 mmm 的 B 树,意味着每个节点最多可以有 m−1m-1m−1 个键和 mmm 个子节点。

  5. 高效磁盘访问:由于每个节点可以存储多个键和指针,B树减少了对磁盘的访问次数。因此,B树在数据库管理系统和文件系统中广泛应用,特别适用于处理大量需要存储在外存(如硬盘)上的数据。

B树的操作:

  • 查找:查找操作从根节点开始,逐层深入,通过比较键值找到目标元素。每次查找时,最多需要访问树的高度层数,这使得查找效率较高。

  • 插入:插入时,首先通过查找找到应插入的位置,然后将新键值插入到合适的节点中。如果节点已满,节点会被拆分,部分键值上移到父节点中。

  • 删除:删除操作更为复杂,如果直接删除某节点会导致树失衡,因此可能需要将相邻节点的键值重新分配,或者将节点合并以保持树的平衡性。

B树的优点:

  • 高效的插入、删除、查找操作,特别是在处理大量数据时。
  • 保证树的高度始终较低,从而减少操作的复杂度。
  • 适用于外存系统的索引结构,因为它减少了对磁盘的访问次数。

常见的改进版本包括 B+(B加)树,它在叶节点中包含所有的数据,并使用顺序链表链接叶节点,从而提高了范围查询的效率。

为什么要发明出B-树?

其实B-树最初被发明出来是为了解决磁盘上读取数据普遍较慢的问题。B-树即使用于内查找也适用于外查找。

这里有人就有意见了呀,为什么别的数据结构不行,偏偏要选择B-呢?

首先,由于磁盘数据过多,假设需要查找磁盘里10亿个值,我们可以看到以上图不同的数据结构的时间复杂度可以看出,最优的就是哈希和平衡二叉树的那两个,AVl树比红黑树相对选择条件更严格,所以选择AVl树,那也需要logn次,也就是说10亿个数据就是30次可以查完,虽然已经很短了,但是磁盘的访问速度太慢了,30次还是显得太多了。

那使用哈希表行不行呢,虽然时间复杂度为o1,但是由于会产生负面的哈希冲突问题,所以比较难以处理多个数据重复映射到同一个位置,比较麻烦!!!

由于磁盘一般不存在空间不足的问题,所以即便使用位图和布隆过滤器也是没有用的。

下面有更清晰的解释可供参考:

所以最大的问题就是磁盘自己本身访问数据太慢了,需要将次数降至个位数才行,于是由于之前的搜索二叉树都是二叉的(一个根最多只有2个孩子节点),所以这里要想提高速率只能降低树的高度,增加根节点的孩子个数(变成多叉)。

就这样B树就诞生了!!!

B树的概念和原理剖析

1970年,R.Bayer和E.mccreight提出了一种适合外查找的树,它是一种平衡的多叉树,称为B树 (后面有一个B的改进版本B+树,然后有些地方的B树写的的是B-树,注意不要误读成"B减树")。一 棵m阶(m>2)的B树,是一棵平衡的M路平衡搜索树,可以是空树或者满足一下性质:

1. 根节点至少有两个孩子//为了增加叉数而设置的

2. 每个分支节点都包含k-1个关键字和k个孩子,其中 ceil(m/2) ≤ k ≤ m ceil是向上取整函数

3. 每个叶子节点都包含k-1个关键字,其中 ceil(m/2) ≤ k ≤ m

4. 所有的叶子节点都在同一层

5. 每个节点中的关键字从小到大排列,节点当中k-1个元素正好是k个孩子包含的元素的值域划 分 6. 每个结点的结构为:(n,A0,K1,A1,K2,A2,… ,Kn,An)其中,Ki(1≤i≤n)为关键 字,且Ki。Ai(0≤i≤n)为指向子树根结点的指针。且Ai所指子树所有结点中的 关键字均小于Ki+1。 n为结点中关键字的个数,满足ceil(m/2)-1≤n≤m-1。

解析开始:我们可以看到这个B树的规则还是比较复杂的。先理清楚几个概念

关键字:就是每一层的节点个数(相当于根)

孩子:就是每个关键字所引出的节点(相当于根的子节点)

2,和3规则可以看出B树是多叉搜索树,如果阶数m为10,那关键字最少为4,最多为9,孩子最少为5,最多为10,并且可以看出,每层的关键字的个数总比其孩子节点少1,说明有一个孩子必定同时是两个相邻的关键字的孩子

第5条规则体现了其仍为搜索树,需要按从大到小排列关键字才可以在后面分裂后通过取中位数的方式取到新的关键字(根)

说到分裂,由于规则3每个叶子节点都包含k-1个关键字,其中 ceil(m/2) ≤ k ≤ m,所以每行的关键字个数最多为阶数-1,当插入的关键字的个数等于阶数m时,就需要进行分裂,分裂具体是怎么样的后面会体现。

原理图讲解(部分讲解在图中)

由于我们这边设的阶数为m = 3,但是我们必须给每行的关键字m个空间,因为如果只给2个(对于m ==3来说,每行关键字最多为2)就无法判断是否关键字等于m,是否需要分裂,因为第3个数无法插入了,多开一个空间方便判断,磁盘很大的不差那一个空间!

刚开始插入时,由于还没有明显的头结点,需要通过不断插入关键字来完成第一次分裂产生,这也比较符合先利用已经开辟好的空间的逻辑

当第一次分裂完成后会产生一个新的单个头节点,之后我们在插入节点的时候必须从叶子节点开始插入,这样才不会剖坏之前已经插入的节点的位置,因为B树仍然是搜索树。从上图也证明了一个结点可能会成为两个根的孩子的理论,所以B树中根节点的个数不是其孩子的两倍,因为根据图可以看出有些孩子被重复利用了,且根节点是通过子节点分裂产生的

分裂引起的根的移动,需要连同着其孩子节点一起移动。种种异样表明B树的设计完全是为了插入数据的方便,不是为了保持平衡而设计的,所以和其他的搜索树不太一样。

这里关键是画图出来,一下展示我画的图:

初始化结点:

根据规则6和演示图解就可以很轻松的得出,每个结点的构造。

由于每个结点是有可能形成多叉的,且一个结点可能会成为两个根的孩子,所以一个结点会先有一个存放关键字的数组,然后为了访问其孩子,还需要一个存有指向此根的全部孩子的指针数组(这里不是单纯的左右指针那么简单了,因为孩子有点多),另外根据上图还需要一个变量n统计关键字的个数(就是当层的结点数),由于我们之前的搜索树都还有一个指向其父亲结点的指针,所以这里也可以考虑加入。

struct BTreeNode
{
    //K _keys[M - 1];
    //BTreeNode<K, M>* _subs[M];

    // 为了方便插入以后再分裂,多给一个空间
    K _keys[M];//关键字(本行节点)
    BTreeNode<K, M>* _subs[M+1];//子节点(快速连串访问,体现树结构)
    BTreeNode<K, M>* _parent;//父亲节点,体现原本三叉链的本质结构
    size_t _n; // 记录实际存储多个关键字 

};

处理数据数量计算(了解)

实际情况运用B树时,阶层通常会很大(B树阶层越大处理的节点数(关键字)就越多数据量就越大),所以我们以下定义形成一个1023阶层的4层的B树。

根据规则,那么每个分支的关键字数最多就为m - 1 = 1023,其孩子为m等于1024,根据下图的逐层推算可以得出每行的关键字和孩子节点的个数。可以看出B树成功的通过压缩了高度同时存储了更多的数据

底层代码实现(加深理解)

欲知后事如何,请听下文分解!!!持续关注博主以解锁B树更多秘密!!!

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

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

相关文章

等保测评新趋势:企业如何领跑网络安全赛道

在当今数字化转型浪潮中&#xff0c;信息安全等级保护&#xff08;简称“等保”&#xff09;测评作为衡量企业网络安全管理水平的重要标尺&#xff0c;正随着网络环境的复杂度提升和法律法规的不断完善而持续进化。本文旨在深入剖析等保测评的最新趋势&#xff0c;并为企业提供…

【论文阅读】StoryMaker | 更全面的人物一致性开源工作

文章目录 1 Motivation2 背景 相关工作 Related work3 Method 方法4 效果 1 Motivation 背景是 Tuning-free personalized image generation methods无微调的个性化图像生成方式在维持脸部一致性上取得了显著性的成功。这里我不是很了解 然而&#xff0c;在多个场景中缺乏整…

iptables和nftables

什么是 nftables ? 它与 iptables 的区别是什么&#xff1f; 几乎每个 Linux 管理员都使用过 iptables&#xff0c;它是一个 Linux 系统的防火墙。但是你可能还不太熟悉 nftables&#xff0c;这是一个新的防火墙&#xff0c;可为我们提供一些必需的升级&#xff0c;还有可能会…

OJ在线评测系统 前端开发整合开源组件 Monaco Editor 并且开发创建题目页面

前端开发整合Monaco Editor 微软官方的 npm install monaco-editor 下载兼容版本 npm install monaco-editorlatest 代码编辑器 先把编辑器本身安装好monaco-editor 安装插件 npm install monaco-editor-webpack-plugin 这个插件的作用是把我们的代码编译器和webpack打包在…

Jenkins使用git和maven编写流水线

1、写git流水线 初识流水线。从git上拉取代码到虚拟机。 【第一步&#xff1a;创建一个新的流水线】 【第二步&#xff1a;定义名字】 点击下方ok&#xff01; 【第三步&#xff1a;添加代码描述】 【第四步&#xff1a;编写流水线代码&#xff0c;如果忘记了&#xff0c;参…

前端框架对比与选择

&#x1f916; 作者简介&#xff1a;水煮白菜王 &#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧✍。 感谢支持&#x1f495;&#x1f495;&#x1f495; 目…

功能测试详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、测试项目启动与研读需求文档 &#xff08;一&#xff09; 组建测试团队 1、测试团队中的角色 2、测试团队的基本责任 尽早地发现软件程序、系统或产品中所…

HarmonyOS鸿蒙开发实战(5.0)自定义路由栈管理

鸿蒙HarmonyOS NEXT开发实战往期文章必看&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发性能实践总结 HarmonyOS NEXT应用开发案例实践总结合集 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门…

中伟视界:AI算法如何精准识别井下与传送带上堆料,提升矿山安全生产效率,减少事故风险

传送带堆料分为两种情况&#xff0c;一种是传送带的井下堆料检测AI算法&#xff0c;一种是传送带上面的堆料检测AI算法&#xff0c;传送带井下堆料检测AI算法是在带式输送机的漏煤下方井下安装摄像仪&#xff0c;通过视频分析检测井下堆煤情况&#xff0c;当洒煤堆积到一定程度…

31214324

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

T-Mobile AI客户服务:客户体验的新时代

目录 IntentCX的诞生利用AI的力量多方面的合作Nvidia的贡献客户服务的范式转变超越客户服务电信中AI的未来 T-Mobile宣布与著名的人工智能研究实验室OpenAI建立战略合作伙伴关系&#xff0c;这一开创性的举动旨在通过利用AI的力量来彻底改变公司的客户服务运营。 IntentCX的…

《解锁高效流程设计:深度剖析责任链模式与实战应用》

《解锁高效流程设计&#xff1a;深度剖析责任链模式与实战应用》 责任链模式 是一种行为设计模式&#xff0c;它允许多个对象来处理请求&#xff0c;而不预先指定具体的处理者。多个处理对象被连接成一条链&#xff0c;沿着这条链传递请求&#xff0c;直到某个处理对象决定处理…

【前端 25】

Ant Design框架使用教程&#xff1a;构建高效美观的React应用 引言 Ant Design 是一套企业级的 UI 设计语言和 React 组件库&#xff0c;主要用于开发和服务于企业级后台产品。它基于 React&#xff0c;并遵循 Ant Design 设计规范&#xff0c;提供了大量高质量、易用的 React…

Spring Boot集成Milvus快速入门demo

1.什么是Milvus&#xff1f; Milvus 是一种高性能、高扩展性的向量数据库&#xff0c;可在从笔记本电脑到大型分布式系统等各种环境中高效运行。它既可以开源软件的形式提供&#xff0c;也可以云服务的形式提供。 Milvus 是 LF AI & Data Foundation 下的一个开源项目&…

计算机的错误计算(一百零四)

摘要 计算机的错误计算&#xff08;二十七&#xff09;引入了错数概念。本节给出更为严格的证明。 本节主要讨论表达式计算结果中错误有效数字的数量&#xff0c;简称之为错数。因为0不含有有效数字&#xff0c;因此&#xff0c;除非特别说明&#xff0c;否则&#xff0c;本节…

【Go】-Websocket的使用

目录 为什么需要websocket 使用场景 在线教育 视频弹幕 Web端即时通信方式 什么是web端即时通讯技术&#xff1f; 轮询 长轮询 长连接 SSE websocket 通信方式总结 Websocket介绍 协议升级 连接确认 数据帧 socket和websocket 常见状态码 gorilla/websocket实…

10-pg内核之锁管理器(五)行锁

概念 数据库采用MVCC方式进行并发控制&#xff0c;读写并不会互相阻塞&#xff0c;但是写之间仍然存在冲突。如果还是采用常规锁那样加锁&#xff0c;则会耗费大量共享内存&#xff0c;进而影响性能。所以行锁通过元组级常规锁和xmax结合的方式实现。一般先通过xmax进行可见性…

Unity 新导航寻路演示(2)

对于静态场景来说&#xff0c;只需要3步 1.为场景Ground添加网格表面组件并烘焙 2.为player添加导航代理 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.AI;public class PlayerMove : MonoBehaviour {private NavMes…

2D动画转3D角色!无需建模- comfyUI工作流一键生成3d效果图!

如何将2d角色转化成3d角色&#xff1f; 不需要建模&#xff0c;通过一个2d转3d的工作流可以直接将你的2d图片转化成3d效果图。 而且操作特别简单&#xff0c;只需要3个步骤&#xff0c;这篇内容我们来说下这个工作路的使用 工作流特点 任意2D图片转换成3D风格 基于sd1.5模型…

ftdi_sio驱动学习笔记 3 - 端口操作

目录 1. ftdi_port_probe 1.1 私有数据结构ftdi_private 1.2 特殊probe处理 1.3 确定FTDI设备类型 1.4 确定最大数据包大小 1.5 设置读取延迟时间 1.6 初始化GPIO 1.6.1 使能GPIO 1.6.2 添加到系统 1.6.2.1 设置GPIO控制器的基本信息 1.6.2.2 设置GPIO控制器的元信息…