B树的介绍

R-B Tree

  • 简介
    • 特性
    • B树
      • 特性
      • m阶B树的性质(这些性质是B树规定的)
  • B树的搜索
  • B树的添加
  • B树的删除——非叶子结点

简介

R-B Tree又称为Red-Black Tree,红黑树。是一种特殊的二叉查找树,红黑树的每个节点上都有存储为表示结点的颜色,可以是红或者黑色。

特性

  1. 每个结点或者是黑色或者红色
  2. 根结点是黑色
  3. 每个叶子节点是黑色(这里的叶子结点指的是:NULL的叶子结点——外部节点 (写代码时候不用加入这些结点)
  4. 如果一个节点红色的,则它的子结点黑色
  5. 结点红色的,则它的父结点黑色的(否则:如果父结点是红色,那么不满足上一条性质 如果该节点是红色的,那么它的子结点是黑色的这个性质了)
  6. 从根结点到叶子结点(外部节点)的所有路径上不能包含两个连续的红结点
  7. 任意节点到叶子结点的所有路径都包含相同数量的黑节点
    特性5说明:确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。
    这样使得在叶子结点中原来的度为0或者度为1的结点最后全部变成了度为2的结点
    在这里插入图片描述

B树

B树是一种平衡的多路搜索树

特性

  1. B树的一个节点可以存储超过两个元素,可以拥有超过两个子结点
  2. 平衡,每个结点的所有子树高度一致
  3. B树 比较矮

m阶B树的性质(这些性质是B树规定的)

可以理解为一个节点最多拥有的子结点数目(3阶B树:代表一个结点最多含有3个子结点)
m阶B树:代表一个结点最多包含5个子结点
下图所示的B树:最多的结点是(包含元素QTX结点,最多包含了4个结点——称为4阶B树)
前提:假设一个节点存储的元素个数为X,

  1. 那么其根结点:1≤X≤m-1(当X=m-1时候才会存在m个根结点)
  2. 那么对于非根结点:┌m/2┐-1≤X≤m-1()
  3. 一个节点它的子结点的个数等于这个结点的元素个数+1:子结点的个数为y=x+1
    4 那么非根结点的个数:为非根结点的元素左右加一:┌m/2┐≤y≤m
    例如:8阶B树,其子结点的个数≤8, m=8, ┌m/2┐ = 4, 4≤y≤8, 3≤X≤7,则8阶B树可以称为(4,8)树;4-8树
  4. 非根结点:┌m/2┐(┌m┐表示对m向上取整)-1≤X≤m-1
    思考为什么非根结点必须满足┌m/2┐-1的向上取整的性质
    在这里插入图片描述
    B树与二叉搜索树具有等价性:
    二叉搜索树的多代结点合并可以获得一个超级结点(存储多个元素)
    两代合并的超级结点首先满足如果根结点存在子结点,那么子结点的数目是根结点的数目+1===>y = x+1最多含有四个子结点
    三代合并的超级结点(那么合并的超级结点 其存在的元素个数最多是将3代中的七个结点 合并在一个结点中,最终形成了具有7个元素的超级结点,那么最终其子节点的个数最多有8个(8阶B树)
    n代合并的超级结点,那么最多含有2n个子结点也就是2n阶树可以理解为n代的子结点的最多个数
    m阶B树,最多需要log2m代进行合并
    在这里插入图片描述

B树的搜索

此图呈现的是4阶B树
在这里插入图片描述
B树的搜索流程:

  1. 先在结点内部通过从小到大顺序来搜索元素
  2. 如果命中,搜索结束
  3. 如果未命中,再通过去对应的子结点中搜索元素,重复步骤1的操作。

B树的添加

明确:新添加的元素必定是添加到叶子结点(不断比较,直到到最后一层,进行结点的添加)

如果这个B树是3阶B树——>结点最多存储2个元素,此时如果插入98到右下角的子结点以后,出现上溢(overflow)

上溢结点的元素个数必然等于B树的阶数
求出上溢结点最中间元素的位置为K,将K位置的元素与父结点合并,再将K位置的元素向上与父结点合并
将[0,k-1]以及[k1,m-1]的位置的元素分裂成两个子结点
这两个子结点的元素的个数,必然都不会低于最低限制(┌m/2┐-1)
一次分裂完毕后,可能导致父结点上溢,依然按照上述方式解决。
最极端的情况可能是一直分裂到根结点。

B树的删除——非叶子结点

假如需要删除的元素在非叶子节点中
1)先找到前驱或者后继元素,然后使得这个直接前驱或者直接后继元素覆盖掉所要删除的元素的值
2)再把这个直接前驱或者直接后继元素删除
往往非叶子节点的前驱或者后继元素必定在叶子节点中
所以最终的删除前驱或者后继元素,就是最开始提到的情况删除的元素在叶子结点中——往往真正删除的元素都发生在叶子节点中
但是必须要满足对于非根结点,其对应的结点的个数为┌m/2┐-1但是删除后的结点可能不满足这个硬性要求(叶子节点被删掉一个元素后,元素的个数可能会低于最低限制┌m/2┐-1)。此时需要做的操作为因为下溢结点的元素数量必然满足其值等于┌m/2┐-2,所以,如果下溢结点的邻近的兄弟结点,至少有┌m/2┐个元素,那么此时产生下溢的结点可以向其兄弟节点借一个元素——将父结点的元素b插入到下溢结点的0(最小位置),然后用兄弟节点的a(最大的元素)代替父结点中的元素b——这种操作其实满足旋转
但是对于下溢结点其邻近的结点只有┌m/2┐-1个元素的情况——(也就是不能元素借位),选择把中间的父结点的元素b挪下来将左右子节点进行合并,合并后的结点的元素个数┌m/2┐+┌m/2┐-2≤m-1
在这里插入图片描述
这个可能导致父结点的下溢——依然按照上述的方法解决,下溢现象可能会一直往上传播,最终传播到根结点

唯一一种能够让B树长高的情况——添加元素后,上溢一直持续到根结点
唯一一种能够让B树变矮的情况——删除元素后,下溢一直持续到根结点
同时,在下溢进行右旋转的时候,如果借的兄弟节点的右子树存在,那么这个右子树需要更改插入到已经借结点成功的结点的最左子树——因为从父结点下来的结点,肯定该元素是小于右侧子节点的最小元素值,所以插入0位置,同时原本该父结点的左子树的右子树的值也比该元素小,所以需要插入到该结点元素的最左子树位置

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络原理 - HTTP/HTTPS(5)

HTTPS HTTPS也是一个应用层协议.在HTTP协议的基础上引入了一个加密层. HTTP协议内容都是按照文本的方式明文传输的. 这就导致了在传输过程中出现了一些被篡改的情况. 臭名昭著的"运营商劫持" 下载一个天天动听. 未被劫持的效果,点击下载按钮,就会弹出天天动听的…

高通XBL阶段读取分区

【需求】: 在某些场景下,需要在XBL阶段读取分区数据,需要验证xbl阶段方案 这里主要以裸分区为例,比如oem分区。 1、创建一个1MB大小的oem.img,写入内容“test oem partition” 创建方式: dd if=/dev/null of=oem.img bs=1024 count=1oem.img内容: 2、XBL阶段读分区方…

【牛牛送书 | 第四期】《高效使用Redis:一书学透数据存储与高可用集群》带你快速学习使用Redis

前言: 当今互联网技术日新月异,随着数据量的爆炸式增长,如何高效地存储和管理数据成为了每个公司都必须面对的挑战。与此同时,用户对于应用程序的响应速度和稳定性要求也越来越高。在这个背景下,Redis 作为一个…

用户体验设计师如何在 2024抢占先机?

01. 严峻的经济形势和就业市场 我们生活在一个通货膨胀的时代。就从超市抓几个苹果、卷心菜、鸡蛋,看看价格吧!我不得不多次检查收据,因为我简直不敢相信。外出就餐费用上涨了 10-20%,现在 Spotify 和 YouTube 要求收取更高的订阅…

[office] EXCEL表格不能使用键盘箭头切换单元格该怎么解决- #媒体#经验分享#知识分享

EXCEL表格不能使用键盘箭头切换单元格该怎么解决? EXCEL表格不能使用键盘箭头切换单元格该怎么解决? 1、入下图所示的键盘。 图中红色标记“1”的地方是Scroll Lock指示灯。Scroll Lock就是“滚动锁定”的意思。当该指示灯亮起来的时候,在excel表格中操…

QEMU开发入门

1. 简介 QEMU(Quick EMUlator)是一个开源的虚拟化软件,它能够模拟多种硬件平台,并在这些平台上运行各种操作系统。QEMU可以在不同的主机架构之间进行虚拟化,例如x86、ARM、PowerPC、Risc-V等。QEMU是一个功能强大且灵…

程序环境和预处理(1)

文章目录 目录1. 程序的翻译环境和执行环境2. 详解编译链接2.1 翻译环境2.2 编译本身也分为几个阶段2.3 运行环境 3. 预处理详解3.1 预定义符号3.2 #define3.2.1 #define 定义标识符3.2.2 #define 定义宏3.2.3 #define 替换规则3.2.4 #和##3.2.5 带副作用的宏参数3.2.6 宏和函数…

Spring 源码阅读:深入探索内部工作机制 | 开源日报 No.180

xuchengsheng/spring-reading Stars: 1.2k License: NOASSERTION 深入 Spring,从源码开始! 作者是一名有8年经验的 Java 后端开发人员,创建了 “Spring 源码阅读系列”,希望与大家共同探索 Spring 的内部工作机制。帮助程序员深…

RabbitMQ-消息队列:发布确认高级

18、发布确认高级 在生产环境中由于一些不明原因,导致 RabbitMQ 重启,在 RabbitMQ 重启期间生产者消息投递失败, 导致消息丢失,需要手动处理和恢复。于是,我们开始思考,如何才能进行 RabbitMQ 的消息可靠投…

Flink join详解(含两类API及coGroup、connect详解)

Flink SQL支持对动态表进行复杂而灵活的连接操作。 为了处理不同的场景,需要多种查询语义,因此有几种不同类型的 Join。 默认情况下,joins 的顺序是没有优化的。表的 join 顺序是在 FROM 从句指定的。可以通过把更新频率最低的表放在第一个、…

适用于高云FPGA的JTAG

目标板卡:小梅哥芯海无涯GOWIN高云ACG525(GW5A-LV25UG324) 1.软件要求:必须用商业版,因为教育版(V1.9.9Beta-4 Education)不支持此封装的GW5A。商业版需要上网申请License,此处提供D4D853392AD8.lic文件(此方法为临时…

基于编译器的静态代码分析与软件开发效率、质量和性能

基于编译器的静态代码分析与软件开发效率、质量和性能 本文节选自《基础软件之路:企业级实践及开源之路》一书,该书集结了中国几乎所有主流基础软件企业的实践案例,由 28 位知名专家共同编写,系统剖析了基础软件发展趋势、四大基…