【B树、B-树、B+、B*树】

目录

  • 一、B-树(即B树)的定义及操作
    • 1.1、定义
    • 1.2、操作
      • 1.2.1、查找
      • 1.2.2、插入
      • 1.2.3、删除
  • 二、B+树的定义及操作
    • 2.1、定义
    • 2.2、操作
      • 2.2.1、查找
      • 2.2.2、插入
      • 2.2.3、删除
  • 三、B*树

一、B-树(即B树)的定义及操作

1.1、定义

B-tree即B树,B是Balanced,平衡的意思,因为B树的原英文名称为B-tree,国内很多人将其译为B-tree,所以B树就是B-树。

磁盘管理系统中的目录管理,以及数据库系统中的索引组织多数都采用B树这种数据结构。

一棵m阶的B树,或为空树,或是满足以下特性的m叉树:

  1. 树中每个结点至多有m棵子树;
  2. 若根结点不是叶子结点,则至少有两棵子树;
  3. 除根之外的所有非终端结点至少有[m/2](向上取整)棵子树;
  4. 所有叶子结点都出现在同一层次上,并且不带信息,通常称为失败结点(失败结点并不存在,指向这些结点的指针为空,引入失败结点是为了便于分析B树的查找性能);
  5. 所有非终端结点最少有[m/2]-1个关键字,最多有m-1个关键字,结点的结构如图所示:
    在这里插入图片描述
    其中,n为结点中关键字的个数,K为关键字,且在这里插入图片描述;P为指向子树根结点的指针,且指针在这里插入图片描述所指子树中所有结点的关键字均小于在这里插入图片描述在这里插入图片描述所指子树中所有结点的关键字均大于在这里插入图片描述
    对任一关键字K而言,在这里插入图片描述相当于指向其左子树,在这里插入图片描述相当于指向其右子树。
    B树具有平衡、有序、多路的特点。
    在这里插入图片描述
    具体实现时,为记录其双亲结点,B树结点的存储结构通常会增加一个parent指针,指向其双亲结点,如图:
    在这里插入图片描述
#define MaxSize 3

typedef struct BTnode{
    int keynum;//结点中关键字的个数,即结点的大小
    struct BTnode *parent;//指向双亲结点
    ElemType key[m+1];//关键字向量,0号单元未用
    struct BTnode *ptr[m+1];//子树指针向量
    Record *recptr[m+1];//记录指针向量,0号单元未用
}BTnode, *BTree;

//B树查找结果类型
typedef struct{
    BTnode *pt;
    int i;//1...m,在结点中的关键字序号
    int tag;//1:查找成功,0:查找失败
}Result;

1.2、操作

1.2.1、查找

算法思想:
将给定值key与根结点的各个关键字进行比较,由于该关键字序列是有序的,所以查找时可采用顺序查找,也可采用折半查找,查找时:

  1. 在这里插入图片描述,则查找成功;
  2. 在这里插入图片描述,则顺着指针在这里插入图片描述所指向的子树继续向下查找;
  3. 在这里插入图片描述,则顺着指针在这里插入图片描述所指向的子树继续向下查找;
  4. 在这里插入图片描述,则顺着指针在这里插入图片描述所指向的子树继续向下查找。
  5. 如果在自上而下的查找过程中,找到了关键字key,则查找成功,如果直到叶子结点也未找到,则查找失败。

1.2.2、插入

思想:针对m阶高度h的B树,插入一个元素时,首先在B树中是否存在,如果不存在,即在叶子结点处结束,然后在叶子结点中插入该新的元素。

  1. 若该结点元素个数小于m-1,则直接插入;
  2. 若该结点元素个数等于m-1,引起结点分裂,以该结点中间元素为分界,取中间元素(若中间元素为两个,则随机选取一个)插入到父结点中;
  3. 重复上述操作,直到所有结点符合B树的规则,最坏的情况是一直分裂到根结点,生成新的根结点,高度增加1。

示例分析:
以5阶B树为例,5阶B树的规则:

  1. 2<=根结点的子树<=5;
  2. 3<=分支结点的子树<=5
  3. 1<=根结点元素个数<=4
  4. 2<=分支结点元素个数<=4
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.2.3、删除

首先查找B树中需删除的元素,如果该元素在B树中存在,则将该元素在其结点中进行删除;删除该元素后,首先判断该元素是否有左右孩子结点,如果有,则上移孩子结点中的某相近元素(“左孩子最右边的节点”或“右孩子最左边的节点”)到父节点中,然后是移动之后的情况;如果没有,直接删除。

  1. 某结点中元素数目小于[m/2]-1,则需要看其某相邻兄弟结点是否丰满;
  2. 如果丰满(结点中元素个数大于(m/2)-1),则向父节点借一个元素来满足条件;
  3. 如果其相邻兄弟都不丰满,即其结点数目等于(m/2)-1,则该结点与其相邻的某一兄弟结点进行“合并”成一个结点;
    以5阶B树为例,详细讲解删除的动作:
    如图依次删除依次删除【8】,【20】,【18】,【5】
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

二、B+树的定义及操作

2.1、定义

B+树是应文件系统所需而产生的B树的变形树。
一棵m阶B+树满足以下条件:

  1. 每个结点最多有M个子结点;
  2. 非叶子结点的根结点至少有两个子结点;
  3. 除根结点外的分支结点至少有[m/2]个子结点;
  4. 有k棵子树的非叶子结点有k个关键字,且关键字按照升序排列;
  5. 叶结点在同一层次中。
  6. 所有叶子结点增加一个链接指针链接在一起;
  7. 所有关键字及其映射数据都在叶子结点中出现。
    在这里插入图片描述
    在这里插入图片描述
    优点:
    B+树的插入过程与B树基本类似,区别在于:
  8. 第一次插入两层结点,一层做分支,一层做根;
  9. B+树在分裂时,是将左半部分的数据保留,右半部分的数据放入新建兄弟结点中,并将新建结点中的最小值更新到父结点中。

2.2、操作

2.2.1、查找

若非终端结点上的关键字等于给定值, 并不终止,而是继续向下直到叶子结点。因此,在B+树中,不管查找成功与否,每次查找都是走了一条从根到叶子结点的路径。B+树查找的分析类似于B-树。

B+树不仅能够有效地查找单个关键字,而且更适合查找某个范围内的所有关键字。例如,在B+树上找出范围在[a, b]之间的所有关键字值。 处理方法如下:通过一次查找找出关键字 a, 不管它是否存在,都可以到达可能出现a的叶子结点,然后在叶子结点中查找关键字值等于a或大于a的那些关键字,对千所找到的每个关键字都有一个指针指向相应的记录,这些记录的关键字在所需要的范围。 如果在当前结点中没有发现大于b的关键字,就可以使用当前叶子结点的最后一个指针找到下一个叶子结点,并继续进行同样的处理,直至在某个叶子结点中找到大于b的关键字,才停止查找。

2.2.2、插入

仅在叶子结点上进行插入,当结点中的关键字个数大于m时要分裂成两个结点,它们所含关键字的个数分别为[(m+1)/2] 和 [(m+1)/2]并且,它们的双亲结点中应同时包含这两个结点中的最大关键字。

2.2.3、删除

B+树的删除也仅在叶子结点进行,当叶子结点中最大关键字被删除时,其 在非终端结点中的值可以作为一个 “分界关键字“ 存在。若因删除 而使结点中关键字的个数少于「m/2]时,其和兄弟结点的合 并过程亦和B-树类似。

三、B*树

B*树是在B+树的基础上,在B+树的非根和非叶子结点增加指向兄弟的指针,将结点的利用率从1/2提高到2/3。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot使用Redis(事务异步add + 更新)

1&#xff0c;简单介绍redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存中数据结构存储系统。 主要特点&#xff1a; 内存存储&#xff1a; Redis 主要将数据存储在内存中&#xff0c;因此读写速度非常快&#xff0c;适合需要高性能的应用场景。…

整洁架构SOLID-里氏替换原则(LSP)

文章目录 定义LSP继承实践正例反例 LSP软件架构实践反例 小结 定义 1988年&#xff0c;Barbara Liskov在描述如何定义子类型时写下了这样一段话&#xff1a; 这里需要的是一种可替换性&#xff1a;如果对于每个类型是S的对象o1都存在一个类型为T的对象o2&#xff0c;能使操作T…

牛客TOP101:合并k个已排序的链表

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 多个链表的合并本质上可以看成两个链表的合并&#xff0c;只不过需要进行多次。最简单的方法就是一个一个链表&#xff0c;按照合并两个有序链表的思路&#xff0c;循环多次就可以了。   另外一个思路&a…

PySide(PyQt),csv文件的显示

1、正常显示csv文件 import sys import csv from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QWidgetclass CSVTableWidgetDemo(QMainWindow):def __init__(self):super().__init__()# 创建显示控件self.widget QWidget(self)sel…

improve-前端运行项目内存溢出解决

1.场景 运行项目时&#xff0c;out of memory&#xff0c;内存溢出。导致前端运行需要重启项目。 2.解决 2.1删除缓存 删除依赖包中的cacle临时缓存 2.2 更改项目配置 "scripts": {"serve": "node --max_old_space_size5120 node_modules/vue/cli-s…

C++基础知识:C++内存分区模型,全局变量和静态变量以及常量,常量区,字符串常量和其他常量,栈区,堆区,代码区和全局区

1.C内存分区模型 C程序在执行时&#xff0c;将内存大方向划分为4个区域 代码区:存放函数体的二进制代码&#xff0c;由操作系统进行管理的&#xff08;在编译器中所书写的代码都会存放在这个空间。&#xff09; 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分…

最优控制公式推导(代数里卡提方程,李雅普诺夫方程,HJB方程)

本文探讨了线性时不变系统&#xff08;LTI系统&#xff09;的最优控制问题&#xff0c;特别是线性二次调节器&#xff08;LQR&#xff09;问题。通过Hamilton-Jacobi-Bellman (HJB) 方程的推导&#xff0c;求得了系统的最优控制律&#xff0c;并进一步推导了代数里卡提方程&…

书生浦语-大模型平台学习-环境搭建01

任务&#xff1a;完成SSH连接与端口映射并运行hello_world.py 详细步骤详见&#xff1a;https://github.com/InternLM/Tutorial/blob/camp3/docs/L0/Linux/readme.md 1、InternStudio介绍 InternStudio 是大模型时代下的云端算力平台。基于 InternLM 组织下的诸多算法库支持…

Win10+Docker环境使用YOLOv8 TensorRT推理加速

这一部分内容和WSL-Ubuntu20.04环境使用YOLOv8 TensorRT推理加速-CSDN博客 是基本相同的,有细微差别我也会在文中指出来。 1.TensorRTX下载 这里使用Wang-xinyu大佬维护的TensorRTX库来对YOLOv8进行推理加速的演示,顺便也验证一下前面环境配置的成果。 github地址:GitHub -…

推荐系统之MIND用户多兴趣网络

目录 引言MIND算法原理1. 算法概述2. 模型结构3. 多兴趣提取层4. 标签感知注意力层 实践应用应用场景1. 电商平台2. 社交媒体3. 视频流媒体4. 内容分发平台 结论 引言 随着大数据和人工智能技术的快速发展&#xff0c;推荐系统已成为电商平台、社交媒体和内容分发平台的重要组成…

写给大数据开发:为什么我们容易不信任数据

目录 1. 产品经理视角&#xff1a;数据优先级低故事与示例伪代码示例 2. 开发者视角&#xff1a;数据任务缺乏技术挑战故事与示例伪代码示例 3. 测试人员视角&#xff1a;数据的不可见性和逻辑复杂性故事与示例伪代码示例 4. 组织文化视角&#xff1a;缺乏数据意识故事与示例伪…

国外UI设计赏析—汽车行业

国外汽车网页设计界面往往展现出几个显著的优点&#xff0c;这些优点不仅提升了用户体验&#xff0c;还增强了品牌形象与产品吸引力。首先&#xff0c;它们注重界面设计的直观性与互动性&#xff0c;通过高清大图、动态效果以及简洁明了的布局&#xff0c;让用户能够一目了然地…

etime:拓展time

拓展C库的time模块&#xff0c;时间格式转换、代码块计时器。

35+打工人:岁月不是枷锁,是经验的徽章

即将8月份上映的电影《逆行人生》以其独特的视角&#xff0c;深刻揭示了一位45岁程序员面对职场年龄歧视的心酸历程&#xff0c;最终选择投身外卖行业的生存抉择。影片不仅触动了观众的心弦&#xff0c;更映射出当下社会就业市场的一隅现实&#xff0c;尤其是在今年应届毕业生人…

[Spring] Spring Web MVC案例实战

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Qt会议室项目

在Qt中编写会议室应用程序通常涉及到用户界面设计、网络通信、音频/视频处理等方面。以下是创建一个基本会议室应用程序的步骤概述&#xff1a; 项目设置&#xff1a; 使用Qt Creator创建一个新的Qt Widgets Application或Qt Quick Application项目。 用户界面设计&#xff1…

明日周刊-第16期

最近很想去看一场蔡健雅的演唱会&#xff0c;以前从来没去过演唱会。原先是想把第一次机会留给周杰伦的演唱会&#xff0c;但是周董的票太难抢了。 文章目录 一周热点资源分享言论歌曲推荐 一周热点 一、经济与市场 北京二手房价环比上涨&#xff1a; 6月份&#xff0c;北京二…

【Diffusion学习】【生成式AI】Diffusion Model 原理剖析 (2/4) (optional)【公式推导】

文章目录 影像生成模型本质上的共同目标【拟合分布】Maximum Likelihood Estimation VAE 影像生成模型本质上的共同目标【拟合分布】 Maximum Likelihood Estimation VAE

19.x86游戏实战-创建MFC动态链接库

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

【智能算法改进】改进的麻雀搜索算法及其求解旅行商问题

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 2.改进点 改进发现者更新位置 为了使 SSA 算法能够避开向原点收敛的弊端, 将算法向最优位置跳跃的操作转换为向最优位置的移动: X i ,…