计算机基础--->数据结构(8)【B树、B+树<超详细图文>】

news2025/1/31 11:09:57

文章目录

  • B树(B-Tree)
    • B树的查询操作
    • B树的几种插入删除情况
  • B+树
    • B+树的主要特点
    • 插入操作
    • 删除操作

B树(B-Tree)

B树(B-Tree)是一种自平衡的搜索树,又称平衡多路查找树,主要用于系统中大量数据的读和写操作。B树的特点是能保持数据有序,这使得在B树中进行查找、顺序访问、插入和删除等操作都非常高效。

B树中单一节点拥有的最多子结点的数量称为B树的阶,一个m阶B树的主要特点如下:

  1. 所有叶子节点都在同一层
  2. 每个节点中的元素都按照升序排列,每个元素的左子树中的所有关键字都小于它,右子树中所有元素都大于它
  3. 若根节点不是叶子节点,则至少有两颗子树(2<=子树个数<=m)
  4. 除根结点和叶子节点外,节点至少有ceil(m/2)棵子树
  5. 有k个孩子的非叶子节点包含k-1个元素(ceil(m/2)<=k<=m,当m=3时,2<=k<=3)

在B树中,插入和删除操作可能涉及节点的分裂和合并,以保持树的平衡性。当插入数据时,如果节点已满,会触发节点的分裂操作;当删除数据时,如果节点过于空闲,会触发节点的合并操作。

B树的查询操作

在这里插入图片描述

上图是一个三阶的B树,如果我们要查找元素5,需要进行如下步骤

  1. 与根节点元素9进行比较,5<9进入左子树
  2. 与左子树元素2和6进行比较,发现2<5<6,进入中间子树
  3. 与中间子树3和5进行比较,找到5

B树的几种插入删除情况

在这里插入图片描述

  • 如果插入10,没有打破规则,直接插入

在这里插入图片描述

  • 如果插入4,这时候可以看到叶子节点元素过多,超过了m-1,因此需要对节点进行分裂
  • 将ceil(m/2)位置的元素上升到父结点
  • 此时父结点的元素个数同样不满足B树规则,因此继续对父结点进行分裂

在这里插入图片描述

  • 删除元素13,没有改变规则

在这里插入图片描述

  • 删除元素8,剩余元素不足,相邻的兄弟节点没有多余元素,这时候就需要与相邻兄弟节点进行合并操作
  • 首先移动父结点中的元素【该元素在两个需要合并的两个结点元素之间】下移到其子结点中,然后将这两个结点进行合并成一个结点
  • 删除元素11,剩余元素不足,相邻兄弟节点有多余元素
  • 删除后,父节点(9,12)就少一个子节点。此时可以向兄弟节点“借”一个元素。但6不可以直接放在元素11的位置,需要上升到到父节点中,再把元素6和12之间的元素9移动到元素11的位置

在这里插入图片描述

  • 删除2

在这里插入图片描述

  • 删除元素6
  • 使用9替代6,删除9之后相邻兄弟没有多余元素,需要从父结点去借一个元素,然后进行合并

B+树

是B树的一种变体,主要用于数据库和文件系统,

B+树的主要特点

  1. 有k个子树的中间节点包含k个元素(B树是k-1),每个元素不保存数据,数据都保存在叶子节点。
  2. 所有的叶子节点包含了全部元素,依照元素的大小升序排列,叶子节点之间用双向指针链接
  3. 所有中间节点的元素都同时存在于子结点,在子结点元素中是最大或最小元素
  4. B+树叶子节点中元素个数为(ceil(m/2)~m),添加第一个节点除外

在这里插入图片描述

在上图的B+树中,根节点元素8在子节点(2,5,8)中是最大元素,也是叶子节点(6,8)的最大元素;根节点元素15在子节点(11,15)中是最大元素,在叶子结点(13,15)中也是最大元素。

B+树的好处

方便进行范围查询,比如我要查询3~11区间的元素

  1. 首先自顶向下,查找区间的最小值3所在的叶子结点
  2. 通过链表指针,遍历到相邻叶子节点(6,8)
  3. 继续通过链表指针,遍历到相邻叶子结点(9,11)

插入操作

情况1. 若被插入元素所在的结点,其含有元素数目小于阶数 m,则直接插入

在这里插入图片描述


情况2. 若被插入关键字所在的结点,其含有关键字数目等于阶数 m,则需要将该结点分裂为两个结点,一个结点包含 ⌈m/2⌉ 。同时,将⌈m/2⌉的关键字上移至其双亲结点。假设其双亲结点中包含的关键字个数小于 m,则插入操作完成

在这里插入图片描述


情况3. 若插入的关键字比当前结点中的最大值还大,破坏了B+树中从根结点到当前结点的所有索引值,此时需要及时修正后,再做其他操作。

在这里插入图片描述


情况4. 在第 2 情况中,如果上移操作导致其双亲结点中关键字个数大于 m,则应继续分裂其双亲结点。插入元素20

在这里插入图片描述

删除操作

情况1:找到存储有该关键字所在的结点时,由于该结点中关键字个数大于⌈M/2⌉,做删除操作不会破坏 B+树,则可以直接删除。

在这里插入图片描述


情况2: 当删除该关键字时,导致当前结点中关键字个数小于 ⌈M/2⌉,若其兄弟结点中含有多余的关键字,可以从兄弟结点中借关键字完成删除操作。

在这里插入图片描述


情况3: 情况2中,如果其兄弟结点没有多余的关键字,则需要同其兄弟结点进行合并。

在这里插入图片描述


情况4: 当删除某结点中最大的关键字时,就会涉及到更改其双亲结点一直到根结点中所有索引值的更改。

在这里插入图片描述


情况5: 当进行合并时,可能会产生因合并使其双亲结点破坏 B+树的结构,需要依照以上规律处理其双亲结点。

在这里插入图片描述

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

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

相关文章

English-英语语法体系

语法体系 英语中的所有语句类型&#xff1a;什么怎么样 英语语法最重要的就是动词&#xff01;

3.4.流的学习,异步任务的管理

目录 前言1. 流总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习精简 CUDA 教程-流的学习&#xff0c;异步任务的管理 课程大…

MySQL库表操作作业

创建数据库 mysql> create database Market; mysql> use Market; 创建表和约束 mysql> create table customers(c_num int(11) primary key not null UNIQUE Key auto_increment , -> c_name varchar(50), -> c_city varchar(50), -> c_birth datetime…

九、HTML中的定位

1、定位 position static 默认值 没有使用定位 relactive 相对定位 absolute 绝对定位 fixed 锚定 标准文档流 标准文档流 从上到下&#xff0c;从左向右&#xff0c;依次显示网页中的每一个元素 元素分类 行内元素 依次一个挨着一个显示 块级元素 独占一行 static 定位 以…

【STM32智能车】智能寻迹

【STM32智能车】智能寻迹 基础算法寻迹小车 我们之前说了到了寻迹这里会涉及到一些算法&#xff0c;不过各位小伙伴可以放心&#xff0c;我们这里用的是一些基础算法。不需要公式&#xff0c;只需要进行简单的判断就行。 基础算法 寻迹车的程序算法如下&#xff1a; 初始化&…

MySQL数据库小练习1

1.创建数据库&#xff0c;删除数据库&#xff0c;查询创建数据的语句&#xff0c;使用数据库&#xff0c;查询当前默认的数据库以及使用的编码方式校验规则 创建数据库及使用数据库&#xff1a; create database hzc default character set utf8mb4 collate utf8mb4_0900_ai_…

uniapp电子签名以及竖屏签名后内容旋转90度变为横屏图片

用该插件挺不错的 电子签名插件地址 如果你一个页面要用多个该插件&#xff0c;就改成不同的cavas-id&#xff0c;修改插件源码 效果图 竖屏写 旋转成横屏图片 插件内 在拿到签名临时地址后的页面 <!-- 旋转图片canvas --> <canvas canvas-id"camCacnvs&quo…

第二次CCF计算机软件能力认证

第一题&#xff1a;相邻数对 给定 n 个不同的整数&#xff0c;问这些数中有多少对整数&#xff0c;它们的值正好相差 1。 输出格式 输入的第一行包含一个整数 n&#xff0c;表示给定整数的个数。 第二行包含所给定的 n 个整数。 输出格式 输出一个整数&#xff0c;表示值正好相…

华为OD计算工时python脚本

前言 刚入职不知道工时要平均每天满8小时&#xff0c;并且看不到每天的实际工时&#xff0c;一气之下花了一个中午写了个脚本计算每天的工时&#xff0c;分享一下&#xff0c;不同地区的兄弟需要修改一下午休和晚饭时间才能使用。 文件位置 把welink上 上下班时间输入work.c…

支持向量机推导之r||w||=1的限制转化

支持向量机推导之r||w||1的限制转化 很多同学肯定是学过支持向量机的&#xff0c;也可能大致的理解了支持向量机这个算法&#xff0c;我想大部分人在学习这个算法的时候&#xff0c;对于推导过程有一步应该是不太理解。 我先简要介绍一下SVM,SVM的核心思想在于找到一个多维空间…

getCurrentInstance

https://blog.csdn.net/m0_46318298/article/details/130726043 注&#xff1a;$是在vue中所有实例中都可用的一个简单约定&#xff0c;这样做会避免和已被定义的数据&#xff0c;方法&#xff0c;计算属性产生冲突。

Leetcode-每日一题【203.移除链表元素】

题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6输出&#xff1a;[1,2,3,4,5] 示例 2&#xff1a; 输入&#…

nginx白名单配置

在有得项目中&#xff0c;我们会希望端口只有特定的用户可以访问&#xff0c;这时候就需要配置nginx的白名单&#xff0c;接来下展示一下白名单的配置和应用 vi /etc/nginx/nginx.conf server {listen 80;listen [::]:80;server_name _;root /usr/share/…

springboot第29集:springboot项目详细

public static LoginUser getLoginUser()&#xff1a;该行声明了一个公共的静态方法 getLoginUser()&#xff0c;它的返回类型是 LoginUser。try&#xff1a;开始一个 try 块&#xff0c;用于处理接下来的代码中可能发生的异常。return (LoginUser) getAuthentication().getPri…

STL好难(6):queue队列的使用

目录 1.queue的介绍 2.queue的使用&#xff1a; 3.queue的模拟实现&#xff1a; 4.deque的介绍&#xff1a; 5.deque的函数接口和底层原理&#xff1a; 6.deque的优缺点&#xff1a; 1.queue的介绍 queue的文档内容 1. 队列是一种容器适配器&#xff0c;专门用于在FIFO上…

二次-InsCode Stable Diffusion 美图活动一期

模型&#xff1a; AbyssOrangeMix2 - SFW_Soft NSFW_AbyssOrangeMix2_sfw.safetensors 参数配置&#xff1a; 正&#xff1a;Mountains and seas, people 负&#xff1a;NSFW, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochr…

C# .NET 如何调用 SAP RFC 接口

1.分析传参结构 SAP 传参格式对应 .NET 参数格式 SAP 参数.NET 参数参数类型import(导入)——关联类型为数据元素Param单个变量参数import(导出)——关联类型为结构体Struct结构体tableTable表 下面是 SAP 对应参数类型&#xff1a; 2.web.config 配置 配置文件需要客户端…

Python学习笔记(十六)————异常相关

目录 &#xff08;1&#xff09;异常概念 &#xff08;2&#xff09;异常的捕获 ①异常捕获的原因 ②捕获常规异常 ③捕获指定异常 ④捕获多个异常 ⑤ 捕获异常并输出描述信息 ⑥捕获所有异常 ⑦异常else ⑧异常的finally &#xff08;3&#xff09;异常的传递 &#xff08…

自动化测试 selenium 篇

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录 什么是自动化测试&#xff1f;Selenium 介绍Selenium 是什么Selenium 特点工作原理 seleniumJava环境搭建ChromeJava1.下载ch…

uni-app:删除默认title

去除前&#xff1a; 可以看到有两个title 去除后&#xff1a; 可以看出就只有手机顶部的title了 "navigationStyle": "custom",//删除默认title