红黑树-随记

news2025/1/12 4:00:41

文章目录

  • 1.为什么hashmap用红黑树不用二叉树和平衡二叉树
    • 1.1 二叉树(Binary Search Tree)
    • 1.2 红黑树(Red Black Tree)
    • 1.3 平衡二叉树(Balence Binary Tree)也称AVT
  • 2.为什么mysql用b+数,不用B数或B*数作为存储引擎的数据结构?
    • 2.1 B树
    • 2.2 B+树
    • 2.3.B*树
    • 2.4.R树
    • 2.5.树的演进
  • 3.深入红黑树
    • 3.1 旋转方式(4种)
      • 3.1.1 节点左旋(节点下右侧子节点深度过长)
      • 3.1.2 节点右旋(节点下的子节点左侧深度过长)
    • 3.2 红黑树自平衡原则(何时触发左右旋及变色)重点
    • 3.2.1.变色
    • 3.2.2.左旋
    • 3.2.3.右旋
    • 3.2.4例子
    • 3.2 插入自平衡(最多2次旋转)
    • 3.3 删除自平衡(最多3次旋转)


1.为什么hashmap用红黑树不用二叉树和平衡二叉树

1.1 二叉树(Binary Search Tree)

特性:
1.每个节点最多有两颗子树,所以二叉树中不存在度大于2的节点;(度=子节点个数)
2.左子树和右子树是有序的,不能任意颠倒
3.即使一个节点只有一颗子树,也要区分是左子树还是右子树

缺点:极端情况下退化成链表,导致索引效率大大降低,也间接影响了删除性能。

1.2 红黑树(Red Black Tree)

红黑树的出现就是为了 解决二叉树退化成链表的问题;它是趋于平衡的树

1.3 平衡二叉树(Balence Binary Tree)也称AVT

特性
1.根节点左边的节点值必须小于根节点,根节点右边的节点值必须大于根节点;
2.每个节点的左右深度差值不能大于1;

缺点:由于节点深度差值不能大于1,所以在大量插入或删除的时候,会一直调整数的平衡,此时性能不如红黑树;原因是由于红黑树的可以容忍最大深度不能超过最小深度2倍,大量的插入和删除时,性能优于AVT。

2.为什么mysql用b+数,不用B数或B*数作为存储引擎的数据结构?

2.1 B树

在这里插入图片描述

特点:
1.每个节点都存储key和value,所有节点组成这棵树,并且叶子节点的指针为null
2.任何一个关键字只出现在一个节点中;如key
3.搜索有可能在非叶子节点结束
4.在关键字全集做一次查找,性能逼近二分查找

2.2 B+树

在这里插入图片描述

特点:
1.只有叶子节点存储数据,包含这颗数的所有索引值,叶子节点不存储指针
(非叶子节点只存储索引值,不存储实际的数据,并非真正的data)
2.增加了访问数据的指针,每个叶子节点增加一个指向相邻叶子节点的指针(范围查下性能大幅提升)

2.3.B*树

在这里插入图片描述
特点:B*树是对B+树的改进,在非叶子节点的兄弟之间增加了双向指针,目的优化B+数在叶子节点满而分裂时的效率;

构建过程对比:
B+树,在叶子节点数据满时,叶子就会分裂;
B*树,在叶子节点数据满时,会询问兄弟节点空间是否满,如果没满,则转移部分关键字;如果满了则每个兄弟节点拿出1/3数据创建新的节点

2.4.R树

R树特性:叶子节点会组多维空间层,查询时性能大幅降低,不再适合数据场景

2.5.树的演进

1、首先,为了保证树的节点均匀分布,所以在二叉树的基础上加上了平衡算法,就有了平衡二叉树。
2、为了减少树的高度,所以B树一个节点下面可以添加N个子节点,然后每个节点的大小限制在磁盘块容量大小,让节点只需要通过一次IO就能读取到所有数据,通过增加节点存储的数据减少了树的高度,而节点的数据变多并没有让IO次数变多。
3、B+树在B树的基础上,在查询的稳定性 和排序方面进行了优化,因为B+树所有的数据都会保存到叶子节点,然后所有叶子节点本身是有序的。
4、B*树为了减少 树在构建过程中节点的拆分、合并次数,所以在每个节点上都保存了旁边节点的指针,在节点需要进行拆分、合并时,优先从旁边节点挪数据,从而减少构建过程中节点拆分、合并的次数,提升了树的构建性能。

3.深入红黑树

优化:解决二叉树极端情况下退化成链表大大降低索引效率的问题

3.1 旋转方式(4种)

3.1.1 节点左旋(节点下右侧子节点深度过长)

在这里插入图片描述

角色:

  • 轴节点(旋转节点): X
  • 被旋节点:Y
  • 子节点:α(阿尔法)、β(贝塔)、γ(伽马)

左旋原理:
1.轴节点右侧子节点作为轴节点的父节点
2.原轴节点的左侧节点父节点和位置不变
3.原被旋节点右侧节点父节点和位置不变
4.轴节点右侧子节点的左侧子节点作为轴节点的右侧子节点

3.1.2 节点右旋(节点下的子节点左侧深度过长)

在这里插入图片描述

角色:

  • 轴节点(旋转节点): Y
  • 被旋节点:X
  • 子节点:α(阿尔法)、β(贝塔)、γ(伽马)

右旋原理
1.轴节点的左侧子节点作为轴节点的父节点
2.轴节点右侧子节点父节点和位置不变
3.被旋节点左节点的父节点和位置不变
4.轴节点的左侧子节点作为被旋节点的右节点

左右旋小结:轴节点左子节点和被旋节点右子节点的父节点和位置不变
位置不变指的是:子节点旋转前和旋转后依然是父节点的左子节点或右子节点;如上图α和γ节点

3.2 红黑树自平衡原则(何时触发左右旋及变色)重点

旋转和变色规则:所有插入节点默认为红色

3.2.1.变色

条件:插入节点的父节点和叔叔节点为红色
步骤:
1.父节点和叔节点变为黑色
2.把祖父节点变为红色
3.把祖父节点作为插入节点

另外变色条件:红黑树为空时,插入当前节点,将当前节点变为黑色

3.2.2.左旋

条件:当前父节点为红色,叔叔为黑色,且当前节点为右子树
步骤:以父节点作为轴节点左旋

3.2.3.右旋

条件:当前父节点为红色,叔叔为黑色,且当前节点为左子树
步骤:
1.把父节点变为黑色
2.把祖父节点变为红色
3.以祖父节点右旋

3.2.4例子

1.插入节点62:
在这里插入图片描述
2.满足变色条件,进行变色。变色后如下
在这里插入图片描述
再将祖父节点作为插入节点,如下图:
在这里插入图片描述
3.满足左旋条件:旋转后如下

在这里插入图片描述
4.再以90作为插入节点,再次判断是否要变色或旋转
在这里插入图片描述
5.满足右旋条件:先变色,后旋转
先变色:变色后
在这里插入图片描述
以祖父作为插入节点右旋:旋转后
在这里插入图片描述

3.2 插入自平衡(最多2次旋转)

1.插入时,红黑树为空,插入节点变为黑色
2.插入时,父节点为黑色,直接插入
3.当父节点为红色时,情况有5种,惨遭上述变色左右旋规则循环直到满足红黑树性质

详情请看java-TreeMap或HashMap源码
java红黑树hashmp插入分析:

3.3 删除自平衡(最多3次旋转)

详情请看java-TreeMap或HashMap源码

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

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

相关文章

Windows程序员学习Linux环境下VI(VIM)编辑器的使用方法

我是荔园微风,作为一名在IT界整整25年的老兵,今天我们来重新审视一下Windows程序员如何学习Linux环境知识。由于很多程序在Windows环境下开发好后,还要部署到Linux服务器上去,所以作为Windows程序员有必要学习Linux环境的知识。VI…

为什么KT6368A双模蓝牙芯片焊到板子上,没反应没收到芯片TX上电返回信息呢

目录 一、问题简介 为什么我把KT6368A芯片焊到板子上面,没有收到芯片TX的脚上电返回信息呢,而KT6368A芯片的2脚一直是2点多v的电压,换了好几个芯片都是这样 二、详细说明 一、问题简介 为什么我把KT6368A芯片焊到板子上面,没有…

QWidgetTable获取选中多行数据

QWidgetTable获取选中的多行数据获取选中行的行编号和打印指定第几列功能快捷键插入链接与图片创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流…

buu [NPUCTF2020]这是什么觅 1

题目描述: 就一个这种文件,用记事本打开后: 题目分析: 打开后就一串看不懂的东西,想想这个东西曾经在 010editor 或 winhex中出现过(右端)既然如此那么我们就用它打开,得到&#…

使用 JaCoCo 生成测试覆盖率报告

0、为什么要生成测试覆盖率报告 在我们实际的工作中,当完成程序的开发后,需要提交给测试人员进行测试,经过测试人员测试后,代码才能上线到生产环境。 有个问题是:怎么能证明程序得到了充分的测试,程序中所…

线程池和ThreadLocal详解

线程池和ThreadLocal详解线程池池化模式:线程池里的线程数量设定为多少比较合适?添加线程规则:实现原理:线程池实现任务复用的原理线程池状态:Executors 创线程池工具类手动创建(更推荐):自动创…

高码率QPSK调制解调方案(FPGA实现篇)

在前面的章节中,已经讲过QPSK调制的方案和Matlab算法仿真,在本篇中,主要讲解基于FPGA的高速QPSK调制的实现。根据前面提到的技术指标,本系统传输的数据速率为500Mbps,中频为720MHz,因此,传统的串行QPSK调制已经不合适在FPGA中实现,需采用全数字的并行方式进行调制,具体…

电商API是什么?为什么要用?主要应用场景有哪些?

电商API是什么?API是application programming interface(应用程序接口)的简称,实际上是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码&#x…

强强联合,再强的英伟达NVIDIA也不落俗套

强强联合,全球科技领域永恒的话题【科技明说 | 每日看点】前些天,我看到GPU领域的英伟达(Nvidia)与微软(Microsoft)做了一项十年期的云计算协议,起初我以为微软Microsoft Azure与英伟达GPU方面有所合作,其实不然&#…

微小目标识别研究(1)——白酒杂质识别

文章目录研究项目简介基于机器视觉技术的白酒杂质检测系统研究(大概浏览)研究背景国内外研究现状和发展趋势国内国外总结白酒杂质检测算法YOLO V3算法K近邻算法滤波处理动态范围增强形态学图像处理运动目标提取数据集制作数据增强基于机器视觉的液体药品…

学习笔记 —— 基于C加速的Python高效计算 (Cython pybind11)

目录引言Cython示例介绍第一阶段优化第二阶段优化Cython Annotation tool优化方法第三阶段优化比对下 JIT的Numba总结pybind11LinksIntroductionImplementationImplementation CmakecytpesCython & pybind11 性能比较TODO Implementation Cmake --pybind11 Cython & py…

Linux SPI 驱动实验

目录 一、Linux 下 SPI 驱动框架简介 1、SPI 主机驱动 2、SPI 设备驱动 SPI 设备数据收发处理流程 3、SPI 设备和驱动匹配过程 二、添加SPI 设备信息 1、添加 ICM20608 所使用的 IO 2、 在 ecspi3 节点追加 icm20608 子节点 三、编写 ICM20608 驱动 1、修改makefile​…

深度学习目标检测ui界面-交通标志检测识别

深度学习目标检测ui界面-交通标志检测识别 为了将算法封装起来,博主尝试了实验pyqt5的上位机界面进行封装,其中遇到了一些坑举给大家避开。这里加载的训练模型参考之前写的博客: 自动驾驶目标检测项目实战(一)—基于深度学习框架yolov的交通…

C++ 二级指针的理解

指针一直很抽象,不是很容易理解,尤其是二级指针。有天路上,脑子里突然想起二级指针,并开始思考什么是二级指针,经过分析和调试验证,对二级指针有了进一步的认识。故写下此篇。 一级指针 假设变量 a、p 的…

消息队列 rabbitmq 学习

RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统。他遵循Mozilla Public License开源协议。 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数…

[YOLO] yolov4 博客笔记

在有了yolov3的基础上,yolov4的网络结构还是很容易看懂的。 这篇博客写的整个yolov4的网络概况 【经典论文解读】YOLOv4 目标检测https://blog.csdn.net/qq_41204464/article/details/119673960?ops_request_misc%257B%2522request%255Fid%2522%253A%25221677916…

SpringBoot一行代码实现文件上传20个平台!少写代码到极致!

又是做好人好事的一天,有个小可爱私下问我有没有好用的springboot文件上传工具,这不巧了嘛,正好我私藏了一个好东西,顺便给小伙伴们也分享一下,demo地址放在文末了。文件上传在平常不过的一个功能,做后端开…

SpringBoot (三) 整合数据库访问 jdbcTemplate、MyBatis

哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮 有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。 Spring Data了解下&#xff1…

实习日记_C#——Day2

运算符重载 通过关键字operator后跟运算符的符号来定义。 public static Box operator (Box b, Box c) {Box box new Box();box.height b.height c.height;return box; }Box box1 new Box(1); Box box2 new Box(2); Box box3 new Box(); bo3 box1 box2;接口&#xff…

基于灵动 MM32 微控制器的便携式血氧仪方案

基于灵动 MM32 微控制器的便携式血氧仪: - Cortex-M0() 最高主频 72MHz 可实现血氧饱和度信号采集、算法操作和 LED 显示操作 - 高性能的 1Msps 12b ADC 能对光电采样结果进行大数据量的暂存和处理,提高采样的效率并有助于对结果做高精度的计算 - 100…