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位置,同时原本该父结点的左子树的右子树的值也比该元素小,所以需要插入到该结点元素的最左子树位置

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

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

相关文章

3-Bean的生命周期

Bean的生命周期 创建对象和初始化是在AbstractAutowireCapableBeanFactory.doCreateBean()中完成的 创建对象 实例化(构造方法)依赖注入 初始化 执行Aware接口回调执行BeanPostProcessor.postProcessBeforeInitialization执行InitializingBean回调&…

ShardingSphere 5.x 系列【15】分布式主键生成器

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 配置3. 内置算法3.1 UUID3.2 Snowflake3.3 NanoId3.4 CosId3.5 Co…

PostgreSQL教程(四):高级特性

一、简介 在之前的章节里我们已经涉及了使用SQL在PostgreSQL中存储和访问数据的基础知识。现在我们将要讨论SQL中一些更高级的特性,这些特性有助于简化管理和防止数据丢失或损坏。最后,我们还将介绍一些PostgreSQL扩展。 本章有时将引用教程&#xff0…

Rust之构建命令行程序(四):用TDD(测试-驱动-开发)模式来开发库的功能

开发环境 Windows 11Rust 1.75.0 VS Code 1.86.2 项目工程 这次创建了新的工程minigrep. 用测试-驱动模式来开发库的功能 既然我们已经将逻辑提取到src/lib.rs中,并将参数收集和错误处理留在src/main.rs中,那么为代码的核心功能编写测试就容易多了。我…

Opencv实战(2)绘图与图像操作

Opencv实战(2)绘图与图像操作 指路前文:Opencv实战(1)读取与像素操作 三、基本绘图 文章目录 Opencv实战(2)绘图与图像操作三、基本绘图(1).line(2).rectangle(3).circle 四、图像处理(1).颜色空间1.意义2.cvtColor()3.inRange()4.适应光线 (2).形态操作1.腐蚀2.膨…

【软件架构】01-架构的概述

1、定义 软件架构就是软件的顶层结构 RUP(统一过程开发)4 1 视图 1)逻辑视图: 描述系统的功能、组件和它们之间的关系。它主要关注系统的静态结构,包括类、接口、包、模块等,并用于表示系统的组织结构…

unity hub (第一部)初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

mysql的日志文件在哪?

阅读本文之前请参阅----MySQL 数据库安装教程详解(linux系统和windows系统) MySQL的日志文件通常包括错误日志、查询日志、慢查询日志和二进制日志等。这些日志文件的位置取决于MySQL的安装和配置。以下是一些常见的日志文件位置和如何找到它们&#xff…

Android Studio基础(下载安装与简单使用)

1、搭建Android开发平台 1.1 Android Studio 下载地址及版本说明 Android 开发者官网: https://developer.android.com/index.html(全球,需科学上网) https://developer.android.google.cn/index.html(国内&#xff…

【Flink精讲】Flink任务调度机制

Graph 的概念 Flink 中的执行图可以分成四层: StreamGraph -> JobGraph -> ExecutionGraph -> 物理执 行图。 StreamGraph:是根据用户通过 Stream API 编写的代码生成的最初的图。用来表示程序的拓扑结构。JobGraph: StreamGraph …

Spring篇----第三篇

系列文章目录 文章目录 系列文章目录前言一、使用 Spring 有哪些方式?二、什么是 Spring IOC 容器?三、什么是依赖注入?四、可以通过多少种方式完成依赖注入?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这…

【MATLAB】 EWT信号分解+FFT傅里叶频谱变换组合算法

有意向获取代码,请转文末观看代码获取方式~ 展示出图效果 1 EWT分解算法 EWT分解算法是一种基于小波变换的信号分解算法,它可以将信号分解为一系列具有不同频率特性的小波分量。该算法的基本思想是将信号分解为多个不同尺度的小波分量,并对…

了解网络延迟-MDN文档学习笔记

了解延迟 查看更多学习笔记:GitHub:LoveEmiliaForever MDN中文官网 CDN CDN (内容分发网络) 指的是一组分布在各个地区的服务器 这些服务器存储着数据的副本,因此服务器可以根据哪些服务器与用户距离最近,来满足数据的请求 CD…

BUUCTF crypto做题记录(8)新手向

一、密码学心声 得到信息如下图 背景故事没什么信息,主要看曲谱。大概率不会让我们涉及与音乐有关的内容,题目中也提示说答案是一串字符串,所以我们可以猜测是将曲谱上的数字转化成字符。曲谱中文字提示是用ASCII码进行转换。没有数字8可能是…

iOS面试:4.多线程GCD

一、多线程基础知识 1.1 什么是进程? 进程是指在系统中正在运行的一个应用程序。对于电脑而已,你打开一个软件,就相当于开启了一个进程。对于手机而已,你打开了一个APP,就相当于开启了一个进程。 1.2 什么是线程&am…

Java核心-核心类与API(2)

话接上回,继续核心类与API的学习,这次介绍StringBuffer/StringBuilder/StringJoiner类。StringBuffer和StringBuilder是我们学习的重点,建议对比学习,做好区分。 一、StringBuffer类 1、概述 1)问题 由于 String 类…

Django学习记录04——靓号管理整合

1.靓号表 1.1 表结构 1.2 靓号表的构造 class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name"手机号", max_length11)# default 默认值# null true,blank true 允许为空price models.IntegerField(verbose_name"价…

websocket了解下

websocket请求长啥样 GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ Sec-WebSocket-Version: 13 啥是websocket websocket是http的一种,服务器可以主动向客户端推送信息,…

18个惊艳的可视化大屏(第七辑):场馆与园区方向

本期分享智慧场馆和智慧园区方向的可视化大屏,各位老铁上车,坐稳了,上图啦。

计算机组成原理(12)----多处理系统

目录 1.SISD(单指令流单数据流) (1)特性 (2)硬件组成 2.SIMD(单指令流多数据流) (1)特性 (2)硬件组成 3.MISD(多指…