当前位置: 首页 > news >正文

漫谈红黑树:红黑树的奇妙演化

漫谈红黑树:红黑树的奇妙演化

  • 一、红黑树的提出
  • 二、红黑树性质的简单推导
  • 三、结论

博主简介


💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
👉
🎖️ CSDN实力新星、CSDN博客专家、华为云云享专家、阿里云专家博主
👉


一、红黑树的提出

追溯起来的话,红黑树的启蒙最早应该是由计算机科学家 Rudolf Bayer 和 Volker Weber 在 1972 年的一篇论文《Maintaining a Search Tree Under Dynamic Insertions and Deletions》引出的;他们的论文主要关注在外部存储器上维护平衡的二叉搜索树,用于数据库的索引结构。

但是,真正的红黑树数据结构应该是Leo J. Guibas和Robert Sedgewick在1978年发布的一篇《A dichromatic framework for balanced trees》论文提出的,该论文提出了一个用于平衡树算法实现和研究的统一框架。该框架只调用包含两个节点的二叉树,它允许每个节点有一个比特,称为节点的颜色来存储平衡信息。也就是红色和黑色。

在这里插入图片描述

这篇论文的作者讨论了与AVL树使用的单旋转和双旋转相同的方式改变树的结构。只是区别在于何时决定旋转和操作节点的颜色。

论文的第一部分主要介绍了常见的平衡树算法可以在O(logN)的时间复杂度内执行各种操作。然而,由于平衡树的种类繁多且缺乏性能分析结果,实际实现起来往往很麻烦。为了解决这个问题,作者提出了一个统一的框架,用于实现和研究平衡树算法。该框架仅处理包含两种类型节点(内部节点和外部节点)的二叉树,并使用每个节点的颜色来存储平衡信息。
在这里插入图片描述

在这里作者观察到了一些特性:

  • 用红色和黑色来储存平衡信息。也就是红黑树的性质之一:节点是红色或黑色。
  • 路径上的黑弧数将是相同的。也就是红黑树的性质之一:从任一节点到其每个叶子节点的简单路径上,所有黑色节点的数量相等。
  • 在任何路径上都不会出现两个连续的红色链接。也是红黑树的性质之一:红色节点的子节点必须是黑色,不能有两个连续的红色节点。
  • 外节点为黑色,内部节点可能是红色或黑色。也是红黑树的性质之一:叶子节点(NIL节点)是黑色。

在这里插入图片描述

作者还发现,每个AVL树都可以变为一棵2-3-4树:在二色表示法中,这可以非常简洁地描述。将节点的高度定义为从该节点到外部节点的最长路径的长度。要将一棵AVL树变成2-3-4树,只需将那些从偶数高度的节点到 奇数高度的节点的链接涂成红色即可。

第二部分使用二色框架进行平衡树算法分析。作者通过设计一个基于局部上下文的平衡器,实现了在不收集整个树的信息的情况下进行平衡操作。经过他们的仿真研究和实证观察,发现各种算法在平均情况下表现良好,并且对输入数据的敏感性较低。而且代码更简洁,只需要传统AVL代码的60%左右。
在这里插入图片描述

第三部分主要讨论了树的其他特性和相关算法。一种一次遍历的自顶向下删除算法,可以在一次遍历中完成删除操作。对算法的性能进行了比较分析。通过他们的实证观察和仿真研究,发现各种算法在平均情况下的性能差异很小。所以,作者建议在大多数应用中使用自顶向下算法,因为它们更简单。
在这里插入图片描述

由此可知,推荐使用红黑树的原因是即使在相同的效率下,它的实现更简单、内存占用更少。AVL的平衡条件太苛刻,左右子树的高度差不能超过1,否则就要出发复杂的rebalance操作,苛刻条件会导致开销不能功过相抵,在写操作频繁的操作中,AVL似乎并不能很好的适应。

二、红黑树性质的简单推导

根据《A dichromatic framework for balanced trees》论文第一部分的说明,我们可以适当的进行推导。红黑树并不是AVL这种顺应逻辑的条件,可以从红黑树的近亲 2-3树进行演示。

2-3树在插入过程中不断增长出新的根,使得树的高度不断增高,底层节点高度永远相等,忽略2节点和3节点的差异后会发现这是一颗完全二叉树,所有节点的高度都相等,是一颗完美的AVL树。

如果将其全部的3节点展开,展开时通过红色边链接展开后的子节点构造成一颗二叉树,比如:
在这里插入图片描述

把当前节点同父节点之间的边的颜色计作节点的颜色,可得:

在这里插入图片描述

这就是这颗2-3树唯一对应的红黑树,从展开前的情况可以知道,未展开红色节点前,所有节点的高度完全一致,展开红色节点后,忽略掉红色节点,所有节点的黑高就是完全一致的,这就是红黑二叉树的性质之一:从任一节点到其每个叶子节点的简单路径上,所有黑色节点的数量相等。

由展开过程和分配节点颜色可知只有父节点原来是3节点时,才会将一个父节点中的一个染色为红色,但是展开后,该红色父节点变成了2节点,不会对该节点进行展开操作,所以该节点的子节点一定是黑色,这也是红黑树的性质之一:红色节点的子节点必须是黑色,不能有两个连续的红色节点。

三、结论

(1)红黑树不是由 AVL演变来的,而是推导出来的。由Rudolf Bayer在1972年引入,然后由Leonidas J. Guibas和Robert Sedgewick在1978年进行了改进。红黑树放宽了平衡的要求,它要求每个节点具有颜色属性(红色或黑色),并通过一些约束来确保树的大致平衡。虽然红黑树的平衡性不如AVL树严格,但由于其相对较少的旋转操作,红黑树在实际应用中表现出更好的性能。

(2)红黑树没有像AVL一样严格的深度差要求,但是要求从任一节点到其每个叶子节点的简单路径上,所有黑色节点的数量相等。

(3)红黑树最开始被引入来解决在动态数据结构中需要保持平衡的问题。它的设计目标是在维护二叉搜索树的基本性质的同时,尽量减少频繁的平衡操作,从而提高插入、删除和查找等操作的效率。

(4)红黑树的应用:

  • 红黑树常被用作关联容器的底层实现,例如在C++的STL中,std::map 和 std::set 就是基于红黑树实现的。
  • 红黑树在存储和数据库系统中也有应用。例如,在数据库索引中,红黑树可以用来维护数据的有序性,从而支持高效的数据检索操作。
  • 在操作系统和调度算法中,红黑树也可以用于管理各种任务和事件,以保持任务的有序性和高效的操作。比如Linux的公平调度算法CFS。
  • 在编译器优化中,红黑树可以用于构建符号表、优化搜索等。

在这里插入图片描述

相关文章:

漫谈红黑树:红黑树的奇妙演化

漫谈红黑树:红黑树的奇妙演化 一、红黑树的提出二、红黑树性质的简单推导三、结论 博主简介 💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能…...

docker启动rabbitmq,但是页面加载不出来问题解决

首先docker启动rabbitmq docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq -d 后台运行 -p 映射外部端口 -- name 取名(方便管理) 然后发现,成功启动rabbitmq,却加载不进去 因为你下载的是rabbitmq的latest…...

Qt项目报错:Cannot run compiler ‘clang++‘. /bin/sh: 1: clang++: not found

在一台旧电脑上装了深度系统,装了Qt,导入项目, build提示 clang找不到: Project ERROR: Cannot run compiler clang. Output: /bin/sh: 1: clang: not found Maybe you forgot to setup the environment? Error while parsing …...

奇舞周刊第503期:图解串一串 webpack 的历史和核心功能

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 图解串一串 webpack 的历史和核心功能 提到打包工具,可能你会首先想到 webpack。那没有 webpack 之前,都是怎么打包的呢?webpack 都有哪些功能&…...

6.redis面试题和坑

1.哨兵模式 多少个节点多少个哨兵(如果全部哨兵检测到已经master dead,重新选举)写sentinel.conf,监控的主机 票数 sentinel monitor myredis 127.0.0.1 6379 1启动哨兵 redis-sentinel sentinel.conf关闭主机 failover sdown info replication shutdown优点 1.基于主从复制模式…...

【ES6】—使用 const 声明

一、不属于顶层对象window 使用const关键字 声明的变量,不会挂载到window属性上 const a 5 console.log(a) console.log(window.a) // 5 // undefined二、不允许重复声明 使用const关键字不允许重复声明相同的变量 cosnt a 5 cosnt a 6 // Uncaught SyntaxEr…...

iOS开发 - Swift Codable协议实战:快速、简单、高效地完成JSON和Model转换!

前言 Codable 是 Swift 4.0 引入的一种协议,它是一个组合协议,由 Decodable 和 Encodable 两个协议组成。它的作用是将模型对象转换为 JSON 或者是其它的数据格式,也可以反过来将 JSON 数据转换为模型对象。 Encodable 和 Decodable 分别定…...

RabbitMq:Topic exchange(主题交换机)的理解和使用

RabbitMq:Topic exchange(主题交换机)的理解和使用 在RabbitMq中,生产者的消息都是通过交换机来接收,然后再从交换机分发到不同的队列中去,在分发的过程中交换机类型会影响分发的逻辑,下面主要讲解一下主题交换机。 ​ 主题交换…...

汽车级36V、4A同步降压转换器MAX20404AFOD/VY、MAX20404AFOC/VY、MAX20404AFOA/VY开关稳压器

MAX20404是小型同步降压转换器,集成了高端和低端开关。这些IC均设计为可在3V到36V的宽输入电压范围内提供高达4A的电流。电压质量可以通过观察PGOOD信号来监测。该器件可以在99%的占空比下运行,非常适合汽车和工业应用。 MAX20404提供可编程输出电压或5…...

C++------利用C++实现二叉搜索树【数据结构】

文章目录 二叉搜索树概念二叉搜索树的操作查找插入删除 二叉搜索树的应用 二叉搜索树 概念 什么是二叉搜索树,二叉搜索树就是指左孩子永远比根小右孩子永远比根大。这个规则适用于所有的子树。 上面的就是一棵二叉搜索树,我们还可以发现这棵树走一个中…...

HotSpot虚拟机之内存模型与线程安全

目录 一、线程内存模型 1. 内存模型 2. 内存模型操作 二、Happens-Before原则 三、Java线程 1. 线程实现方式 2. Java线程状态 四、Java线程安全 1. 线程安全程度 2. 锁优化 五、参考资料 一、线程内存模型 1. 内存模型 内存模型主要目的是定义共享变量的访问规则&…...

TiDB 多集群告警监控-中章-融合多集群 Grafana

作者: longzhuquan 原文来源: https://tidb.net/blog/ac730b0f 背景 随着公司XC改造步伐的前进,越来越多的业务选择 TiDB,由于各个业务之间需要物理隔离,避免不了的 TiDB 集群数量越来越多。虽然每套 TiDB 集群均有…...

【图像分类】基于卷积神经网络和主动学习的高光谱图像分类(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

notepad++ verilog关键字自动补全

新建verilog.xml放在安装目录下 D:\Program Files (x86)\Notepad\autoCompletion <?xml version"1.0" encoding"Windows-1252" ?> <NotepadPlus><AutoComplete><KeyWord name"accept_on" /><KeyWord name"a…...

C语言知识

C语言知识 链接 C语言中的数组初始化是有三种形式的&#xff0c;分别是&#xff1a; (1)数据类型 数组名称[长度n] {元素1,元素2…元素n}; (2)数据类型 数组名称[] {元素1,元素2…元素n}; (3)数据类型 数组名称[长度n]; 数组名称[0] 元素1; 数组名称[1] 元素2; 数组…...

数据结构基础

将节点构建成树 数据的结构逻辑结构集合线性结构树形结构图状结构 存储结构合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如…...

深度学习中数据处理相关的技巧

文章目录 提取隐蔽特征惰性加载数据集类别分布不均衡 提取隐蔽特征 在某些任务中&#xff0c;一些类别的特征可能相对较为罕见或难以捕捉。由于这些特征在数据集中出现的频率较低&#xff0c;模型可能无法充分学习它们&#xff0c;从而导致对这些类别的辨别能力较弱。为了解决…...

wkhtmltopdf 与 .Net Core

wkhtmltopdf 是使用webkit引擎转化为pdf的开源小插件. 其有.NET CORE版本的组件,DinkToPdf,但该控件对跨平台支持有限 。 是由于各系统平台会产生不同的编译结果,故windows上使用.dll,而Linux上的动态链接库是.so 所以你需要在Linux系统上安装相关wkhtmltox软件。 我这里准备了…...

Linux Mint 21.3 计划于 2023 年圣诞节发布

Linux Mint 项目近日公布了基于 Ubuntu 的 Linux Mint 发行版下一个重要版本的一些初步细节&#xff0c;以及备受期待的基于 Debian 的 LMDE 6&#xff08;Linux Mint Debian Edition&#xff09;版本。 近日&#xff0c;Linux Mint 项目负责人克莱门特-勒菲弗&#xff08;Clem…...

腾讯云3年轻量应用服务器2核4G5M和2核2G4M详细介绍

腾讯云轻量应用服务器3年配置&#xff0c;目前可以选择三年的轻量配置为2核2G4M和2核4G5M&#xff0c;2核2G4M和2核4G5M带宽&#xff0c;当然也可以选择选一年&#xff0c;第二年xufei会比较gui&#xff0c;腾讯云百科分享腾讯云轻量应用服务器3年配置表&#xff1a; 目录 腾…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...