B-Tree (多路查找树)分析-20230503

news2024/11/25 1:02:20

B-Tree (多路查找树)学习-20230503

  1. 前言

B-树是一类多路查询树,它主要用于文件系统和某些数据库的索引,如果采用二叉平衡树访问文件里面的数据,最坏情况下,磁头可能需要进行O(h)次对磁盘的读写,其中h为树的高度;此时如果采用B-树,由于它的多路访问特性可显著降低树的高度,所以对磁盘读写次数将大幅减少。

为了更清楚表述,我们引入经典的二次储存系统,为了增加储存容量,通常由多个磁盘构成,如果可以多路对磁盘进行访问,那么通过一次读取,很快可以定位数据的储存区域。

在这里插入图片描述

  1. B-Tree 的定义

根据《数据结构》(严蔚敏)定义一颗m阶的B-tree,或为空树,或满足下列特性的m叉树,

  • 树中每个结点至多有m棵树,它定义节点中包含数据的上限值,此值和每个track的容量相关,由于B-tree的节点即储存键值,又储存子树指针,一般情况下键值会占据大量的数据空间,尤其是键值为结构体数据类型的时候,空间占据会急剧增加,为了应对这类挑战,人们发明了B+tree的数据结构
  • 若根节点不是叶子节点,则至少有两棵树。此约束保证了B-tree不会退化为线性表,最坏情况下,允许退化为二叉树,这是最后的底线
  • 除根节点之外的非终端节点至少有[m/2]棵子树,其中[m/2]取上限值
  • 为了后续的程序操作方便,定义非终端结点包含下列数据信息的数据

( n , A 0 , K 1 , A 1 , K 2 , A 2 , . . . , K n , A n ) ; (n,A_0,K_1,A_1,K_2,A_2,...,K_n,A_n); (n,A0,K1,A1,K2,A2,...,Kn,An);

其中Ki为关键字,且K[i]<K[i+1],并且A[i-1]所指向的节点里面的关键字均小于K[i]关键字,A[i+1]所指向节点里面的关键字均大于K[i],n为关键字的数量([m/2]-1<=n<=m)

  • 所有的叶子节点都在同一层次上,并且不带信息
  1. B-Tree 基本操作

3.1 查询操作

B-Tree树的查询操作与二叉查询树的查询操作类似。它实际上上分为两部分,第一部分需要找到值所在的节点的指针,然后在节点中可以采用顺序表搜索或者折半查找的方式定位待查询的值或者值所在的子树(指针),它是查找节点和在节点中搜索关键字的交叉进行的过程。

在这里插入图片描述

具体看一个例子,假定要查找key=99的值,从根节点出发,由于99>35,那么顺着A1指针指向的结点进行搜索,在A1指向的结点中,由于99>78,继续在A2所指的结点中搜索,在A2结点当中恰好K1=99,搜索完毕。

3.2 插入操作

B-Tree的生成是不断通过插入操作实现的,增加B-Tree高度唯一的途径是根节点的分裂,每次根节点分类事件发生,B-Tree的深度就增加1。除此之外,其它的插入也可能差生节点的分裂,但只要根节点不产生分裂,那么B-tree的深度就保持不变。

由于节点内关键字数目的限制,插入操作可能会导致节点分裂,这也导致了插入过程的复杂化。具体而言,插入某个值可以采用两个策略当中的任意一个,策略1 首先在最底层的某个非终端节点条件一个关键字,若该节点的数目不超过m-1,则插入完成,否则要产生节点的分裂,策略1实际上采用的是自下而上的方法,先从根节点出发,找到需要插入节点在最底层非终端节点上位置,然后执行插入,如果必要,则自下而上进行不断分裂。

具体看一个例子。对于m=3阶B-Tree,[m/2]=2。

在这里插入图片描述

假定需要依次插入关键字30,26,85和7,首先查找确定关键字应该插入的最底层结点的位置。通过查找得知,30应该插入在结点d所在位置,插入完成后,由于插入后的关键字数量小于m,无需任何分裂,插入作业完成。

在这里插入图片描述

同样查找关键字26亦应插入在d结点当中,由于d结点中关键在数目超过2,此时需要将d分裂成为两个结点,关键字26及其前后指针仍然保留在d结点中,而关键字37及其前后指针需要储存到新产生的结点d’当中。同时将中间关键字30和d’指针,一起插入到双亲结点中。由于更新后的b结点关键字未超过2,则插入完成。

在这里插入图片描述

结点d分裂为d和d’两个不同的结点。

在这里插入图片描述

类似地,在g中插入85后,需要分裂为两个结点,而当70插入到e结点当中去,由于e中的结点数目超过2,需要继续分裂;直到70插入到a结点中,插入结束。
在这里插入图片描述

85关键字插入后,g节点关键字数目不满足b-tree节点数目的基本要求,需要进行分裂,中间关键字70需要往移动到上一层节点e中去。由于70关键字的插入,导致 e结点关键字数量超过2,对于e结点需要继续分裂,中间关键字70继续往上移动至 结点a当中。

在这里插入图片描述

e结点分裂后的B-tree.

在这里插入图片描述

采用相同的思路,插入关键字7,通过查找关键字7应当插入至底层结点c当中,插入c后,由于c结点中的关键字数量大于2,需要分裂,关键字7移动至结点b当中,类似地,b结点中的关键字数量大于2;中间关键字24继续向上插入至根节点,由于根节点关键字数量大于2,根节点需要分裂,B-tree深度增加1,至此插入结束。

3.3 删除操作

B-Tree的删除操作比较复杂,其主要约束来自于B-tree特性的保持,一般情况下,则首先找到待删除关键字所在的结点,如果关键字所在结点为最下层的非终端节点,如果关键字数目不小于[m/2],直接删除即可,否则就需要自下而上进行结点的合并。倘若删除关键字为非终端结点Ki,则可以用指针Ai所指的树的最小关键字Y代替Ki,然后在相应的结点中删除Y即可。所以只需讨论删除最下层非终端结点的关键字即可。

有下列三种情况:

(1) 被删除关键字结点中的关键字数量不小于[m/2],则直接删除Ki和Ai即可,树的其它部分保持不变化。从树中删除关键字12就属于此类型。

在这里插入图片描述

删除12后,树的其它部分保持不变。

在这里插入图片描述

(2)被删除关键字所在的结点关键字数目为[m/2]-1,而与该节点相邻的右(左)兄弟结点的关键字数目大于[m/2]-1,则需将相邻右兄弟结点中最小(最大)的关键字上移至双亲结点中,而将双亲结点中小于(大于)且紧靠该上移关键字的关键字下移至被删除的结点当中。删除B-tree的关键字50便是如此情形。

在这里插入图片描述

(3)被删除关键字所在结点的左右子树关键字的数目都等于[m/2]-1, 假设该节点有右兄弟,且右兄弟结点由双亲结点中的Ai指针所指,那么在删除关键字之后,它所在的结点剩余的关键字和指针,另外加上双亲结点的Ki关键字合并到Ai所指的有兄弟结点中去。合并至左节点的逻辑亦相同。

删除关键字53,便是上述情形。

在这里插入图片描述

  1. 小结

由于B-tree的定义限制,导致 B-tree在插入和操作的时候需要分裂或合并结点,造成整体程序实现的复杂性。其实现方式通常采用自下而上,根据约束条件不断进行分裂或合并,直至根节点。另外B-tree深度增加的唯一途径就是根节点的分裂,B-tree深度减低的唯一途径就是根节点的合并。

参考文献:

并结点,造成整体程序实现的复杂性。其实现方式通常采用自下而上,根据约束条件不断进行分裂或合并,直至根节点。另外B-tree深度增加的唯一途径就是根节点的分裂,B-tree深度减低的唯一途径就是根节点的合并。

对于代码实现,如果有时间,我们将另外篇幅描述。

参考文献:

  1. 《数据结构》 严蔚敏

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

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

相关文章

探究Android插件化开发的新思路——Shadow插件化框架

Shadow插件化框架是什么&#xff1f; Shadow是一种Android App的插件化框架&#xff0c;它利用类似于ClassLoader的机制来实现应用程序中的模块化&#xff0c;并让这些模块可以在运行时灵活地进行加载和卸载。Shadow框架主张将一个大型的Android App拆分成多个小模块&#xff…

提升V-Ray渲染效率的五个实用技巧!

Chaos V-Ray是一个 3D渲染插件&#xff0c;可用于所有主要的 3D设计和 CAD程序。V-Ray可以和 3ds Max、Cinema 4D、Houdini、Maya、Nuke、Revit、Rhino、SketchUp和 Unreal无缝协作。艺术家和设计师也可以通过使用 V-Ray的实时光线来追踪探索和分享自己的项目&#xff0c;并渲染…

SpringBoot调取OpenAi接口实现ChatGpt功能

很高兴和大家分享我实现的一个小项目&#xff0c;利用 Spring Boot 实现了一个 ChatGpt 对话系统。在本文中&#xff0c;我将详细介绍这个项目的实现步骤&#xff0c;以及代码实现。 什么是 ChatGpt ChatGpt 是一种基于 GPT 技术的对话系统&#xff0c;能够生成连贯、流畅、…

V-Ray怎么快速渲染_渲染加速小技巧

很多小伙伴在使用V-Ray渲染器的时候都想要更加快速的出图&#xff0c;今天Renderbus瑞云渲染就给大家分享一下V-Ray渲染加速的小技巧。 在了解渲染加速技巧之前&#xff0c;我们首先要了解渲染制作主要受两个因素影响——图像质量和渲染时间&#xff0c;高图像质量是以长渲染时…

k8s集群搭建(3主2从)

目录 kubeadm 和二进制安装 k8s 适用场景分析 多 master 节点高可用架构图 集群环境准备 部署过程 修改主机内核参数&#xff08;所有节点&#xff09; 配置阿里云的repo源&#xff08;所有节点&#xff09; 配置国内安装 docker 和 containerd 的阿里云的 repo 源 配置…

day11 TCP连接管理与UDP协议

目录 ​编辑 连接的建立——”三次握手” 连接的释放——“四次挥手” 保活计时器 用户数据报协议 UDP​编辑 连接的建立——”三次握手” TCP 建立连接的过程叫做握手。 采用三报文握手&#xff1a;在客户和服务器之间交换三个 TCP 报文段&#xff0c;以防止已失效的连接…

SPSS如何进行多重响应分析之案例实训?

文章目录 0.引言1.多重响应变量频率分析2.对多重响应变量集进行交叉表分析3.使用表过程研究多重响应变量集 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对SPSS进行了学习&#xff0c;本文通过《SPSS统计分析从入门到精通》及其配套素材结合网上相关资料进行学习笔记…

对模式的迷信,大部分是幻觉和妄想

对模式的迷信&#xff0c;大部分是幻觉和妄想 往往有严重的投机心理 郑翔洲&#xff0c;所谓模式设计专家 还是有点虚&#xff0c;仅供一点参考 说苹果、说华为、说小米这些总结都是事后诸葛亮 趣讲大白话&#xff1a;商业模式被妖魔化 【趣讲信息科技153期】 ****************…

从零构建等保三级|安全狗一站式等保解决方案助用户快速过等保

一 政策法规下的等级保护 “没有网络安全就没有国家安全&#xff0c;没有信息化就没有现代化。” 在2017年6月1日&#xff0c;我国开始全面实行《网络安全法》&#xff0c;其中第二十一条规定了“国家实行网络安全等级保护制度”。此外&#xff0c;在2019年5月13日&#xff…

数据开发常见问题

目录 环境变量过多或者参数值过长时&#xff0c;为什么提交作业失败&#xff1f; 为什么Shell作业状态和相关的YARN Application状态不一致&#xff1f; 创建作业和执行计划的区别是什么&#xff1f; 如何查看作业运行记录&#xff1f; 如何在OSS上查看日志&#xff1f; 读…

阿里云服务器vCPU和CPU有什么区别?

阿里云服务器vCPU和CPU是什么意思&#xff1f;CPU和vCPU有什么区别&#xff1f;一台云服务器ECS实例的CPU选项由CPU物理核心数和每核线程数决定&#xff0c;CPU是中央处理器&#xff0c;一个CPU可以包含若干个物理核&#xff0c;通过超线程HT&#xff08;Hyper-Threading&#…

不坑盒子 (Office、WPS插件)高效办公,让你提前进入摸鱼状态。

不坑盒子简介 很多朋友在工作过程中需要对Word文档进行编辑处理&#xff0c;如果想让Word排版更有效率可以试试小编带来的这款不坑盒子软件&#xff0c;是一个非常好用的办公工具&#xff0c;拥有近百项功能的Word&#xff0c;wps插件&#xff0c;支持Office 2010以上的版本&a…

Python入门(二)变量和简单数据类型(一)

变量和简单数据类型&#xff08;一&#xff09; 1.变量1.1 变量的命名和使用1.2 变量其实是标签 2.字符串2.1 使用方法修改字符串的大小写2.2 在字符串中使用变量 2.3 使用制表符或换行符来添加空白2.3 使用字符串时应该避免的错误 作者&#xff1a;Xiou 1.变量 下面来尝试在…

System verilog【1】基础语法和数据类型+容器+结构体+不可综合的数据类型

前言 某种事情是不可能重新复原的&#xff0c;只能向前推进……不管什么地方&#xff0c;两人能去哪里就去哪里好了——《国境以南太阳以西》 \;\\\;\\\; 目录 前言内建数据类型reg和wire和logiclogic和bit四值和二值类型位宽类型转换隐式转换 常见数据类型定宽数组动态数组pa…

在Transformer模块上用CNN网络搭建方式解决图像分类问题

来源&#xff1a;投稿 作者&#xff1a;摩卡 编辑&#xff1a;学姐 论文标题&#xff1a;DeepViT: Towards Deeper Vision Transformer Motivation 本文受到传统CNN网络搭建方式的启发(深层的CNN网络可以学习到关于图像更加丰富和复杂的表示), 于是思考是否可以将这种搭建方式…

我的“测试开发”成长之路

我相信&#xff0c;有很多测试人员会不断问自己&#xff0c;自己到底要不要坚持做测试&#xff0c;测试的职业发展到底怎么样&#xff1f;如果你还在迷茫&#xff0c;在到处找各种大牛问类似的问题&#xff0c;我希望这篇文章&#xff0c;你看完能够结束你的这个烦恼&#xff0…

Sketch会不会出windows版本?

Sketch会不会出windows版本&#xff1f;Sketch 可以在线编辑吗&#xff1f;先说结论&#xff0c;不能。 但有一个更好用易用的 Windows 也能用的「协作版 Sketch」&#xff0c;最大的特点3个&#xff1a;在线、免费、Windows也能用&#xff01; Windows 也能用的「协作版 Ske…

JavaScript全解析——canvas 入门(上)

●canvas 是 HTML5 新增的一个标签, 表示画布 ●canvas 也是 h5 的画布技术, 我们通过代码的方式在画布上描绘一个图像 canvas 标签 ●向进行 canvas 绘图, 首先我们先要了解到 canvas 标签 ●是 html5 推出的一个标签 <html> <head>... </head> <body&…

mysql详细教程

目录 1、初识数据库 1.1、什么是数据库 1.2、数据库分类 1.3、相关概念 1.4、MySQL及其安装 1.5、基本命令 2、操作数据库 2.1、操作数据库 2.2、数据库的列类型 2.3、数据库的字段属性 2.4、创建数据库表 2.5、数据库存储引擎 2.6、修改数据库 3、MySQL数据管理…

基于numpy的鸢尾花数据获取、处理等操作。

这是搬运的。 Python 3 可信的 FileEditViewInsertCellKernelHelp 运行 代码标记原生 NBConvert标题- 《基于numpy的鸢尾花数据操作》 一、 实验准备 1.1 实验概述 我们本次实验将会使用的编程语言是Python&#xff0c;在本次实验当中我们将会使用结合我们学习过的numpy 中的知…