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

一起来看--红黑树

【欢迎关注编码小哥,学习更多实用的编程方法和技巧】

        红黑树是一种自平衡的二叉搜索树,广泛应用于计算机科学中,尤其是在实现关联数组和集合时。它的设计旨在确保在最坏情况下,基本动态集合操作(如插入、删除和查找)的时间复杂度为 O(log n)。红黑树的平衡性通过节点的颜色属性和特定的旋转操作来维护。

红黑树的性质

红黑树具有以下五个基本性质:

  1. 每个节点是红色或黑色:每个节点都有一个颜色属性,红色或黑色。
  2. 根节点是黑色:树的根节点始终是黑色。
  3. 红色节点的子节点是黑色:如果一个节点是红色,则它的两个子节点必须是黑色(即没有两个红色节点相连)。
  4. 每个节点到其每个叶子节点的路径都包含相同数量的黑色节点:这保证了从根到叶子的路径不会过长,从而保持树的平衡。
  5. 叶子节点是黑色:红黑树的叶子节点(空节点)被视为黑色。

这些性质确保了红黑树的高度不会超过 2 * log(n),从而保证了操作的高效性。

红黑树的基本操作

1. 插入操作

插入操作包括以下步骤:

  1. 普通的二叉搜索树插入:首先,将新节点插入到树中,像普通的二叉搜索树一样。
  2. 着色:将新插入的节点着色为红色。
  3. 修复红黑树性质:通过旋转和重新着色来修复可能违反红黑树性质的情况。

插入后的修复过程通常涉及以下几种情况:

  • 情况 1:新节点的父节点是黑色,树仍然是合法的。
  • 情况 2:新节点的父节点是红色,且叔叔节点也是红色。此时,将父节点和叔叔节点都变为黑色,并将祖父节点变为红色,然后继续修复。
  • 情况 3:新节点的父节点是红色,叔叔节点是黑色。此时,需要进行旋转操作。

2. 删除操作

删除操作相对复杂,主要步骤如下:

  1. 普通的二叉搜索树删除:首先,找到并删除节点,像普通的二叉搜索树一样。
  2. 修复红黑树性质:删除后,可能会破坏红黑树的性质,特别是黑色节点的数量。需要通过旋转和重新着色来修复。

删除后的修复过程通常涉及以下几种情况:

  • 情况 1:被删除的节点是红色,直接删除即可。
  • 情况 2:被删除的节点是黑色,且其子节点是红色。此时,将子节点替换到被删除节点的位置,并将其着色为黑色。
  • 情况 3:被删除的节点是黑色,且其子节点也是黑色。此时,需要进行更复杂的修复,可能涉及兄弟节点的颜色和旋转。

红黑树的优缺点

优点

  1. 自平衡:红黑树通过颜色和旋转操作保持平衡,确保操作的时间复杂度为 O(log n)。
  2. 高效的查找、插入和删除:由于其平衡性,红黑树在动态数据集中的表现优于普通的二叉搜索树。
  3. 广泛应用:红黑树被广泛应用于许多标准库中,如 C++ 的 STL 和 Java 的 TreeMap。

缺点

  1. 实现复杂:红黑树的实现相对复杂,特别是在插入和删除操作中需要处理多种情况。
  2. 空间开销:每个节点需要额外的空间来存储颜色信息。

应用场景

红黑树在许多应用中都发挥着重要作用,以下是一些红黑树的具体应用举例:

1. STL中的std::mapstd::set

        在C++标准模板库(STL)中,std::mapstd::set都是基于红黑树实现的。这使得它们能够在插入、删除和查找操作中保持 O(log n) 的时间复杂度。红黑树的自平衡特性确保了这些容器在处理动态数据时的高效性。

2. Java中的TreeMapTreeSet

       Java的集合框架中,TreeMapTreeSet也使用红黑树作为底层数据结构。这使得它们能够提供有序的键值对存储和高效的查找、插入和删除操作。TreeMap特别适合需要按顺序遍历键的场景。

3. 数据库索引

       许多数据库管理系统(DBMS)使用红黑树来实现索引。由于红黑树能够高效地处理动态数据集,它们被用来快速查找、插入和删除记录。例如,某些 NoSQL 数据库和内存数据库使用红黑树来管理数据的索引。

4. 操作系统中的调度

       在操作系统中,红黑树可以用于管理进程调度和内存管理。例如,Linux 内核使用红黑树来管理虚拟内存区域(VMA)。通过红黑树,操作系统能够高效地查找、插入和删除内存区域,从而优化内存分配和回收。

5. 网络路由表

       在网络设备中,红黑树可以用于存储和管理路由表。由于路由表需要频繁更新和查询,红黑树的高效性使其成为理想的选择。通过使用红黑树,网络设备能够快速查找最佳路径并动态更新路由信息。

6. 事件驱动编程

       在事件驱动的系统中,红黑树可以用于管理事件队列。例如,在游戏引擎或图形用户界面(GUI)框架中,红黑树可以用于按时间戳排序的事件调度。通过红黑树,系统能够高效地插入新事件并按顺序处理它们。

7. 版本控制系统

       在版本控制系统中,红黑树可以用于管理文件的版本历史。通过使用红黑树,系统能够高效地存储和查找不同版本的文件,支持快速的版本切换和合并操作。

8. 自定义数据结构

       开发者可以根据需要使用红黑树实现自定义数据结构,例如优先队列、集合或映射。由于红黑树的自平衡特性,开发者可以确保这些数据结构在动态操作中的高效性。

       红黑树是一种高效的自平衡数据结构,适用于需要频繁插入、删除和查找操作的场景。通过其独特的性质和操作,红黑树能够在最坏情况下保持良好的性能。尽管实现较为复杂,但其在实际应用中的优势使其成为许多算法和数据结构的基础。理解红黑树的工作原理和应用场景,对于计算机科学和软件开发人员来说,都是一项重要的技能。

相关文章:

一起来看--红黑树

【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 红黑树是一种自平衡的二叉搜索树,广泛应用于计算机科学中,尤其是在实现关联数组和集合时。它的设计旨在确保在最坏情况下,基本动态集合操作(如插入、删除和查找&am…...

SpringBoot整合篇 05、Springboot整合Redission

文章目录 前言Redission详细配置步骤pom依赖application.yaml配置类CacheConfigEnvironmentContext RedissionController单测 前言 本篇博客是SpringBoot整合Redission,若文章中出现相关问题,请指出! 所有博客文件目录索引:博客…...

供应链系统设计-供应链中台系统设计(六)- 商品中心概念篇

概述 我们在供应链系统设计-中台系统设计系列(五)- 供应链中台实践概述 中描述了什么是供应链中台,供应链中台主要包含了那些组成部门。包括业务中台、通用中台等概念。为了后续方便大家对于中台有更深入的理解,我会逐一针对中台…...

胡闹厨房练习(三)

ScriptableObject 一、初步了解 1、实质:是一种特殊类型的Unity对象, 2、作用:用于存储大量数据,而不必依附于游戏场景中的某个GameObject。 3、特点: 可以在不增加场景中对象数量的情况下,管理和存储复杂的数据结构、配置信息、游戏状态等。 4、适用:非常适合用来…...

关于ESD(静电放电)等级的划分

关于ESD(静电放电)等级的划分,主要依据不同的测试模型和测试标准。以下是对HBM(人体模型)和CDM(充电器件模型)两种测试模型下ESD等级划分的详细解释: HBM ESD等级划分 HBM ESD等级…...

探究步进电机与输入脉冲的关系

深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容: 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观,我更建议…...

基于YOLOV5+Flask安全帽RTSP视频流实时目标检测

1、背景 在现代工业和建筑行业中,安全始终是首要考虑的因素之一。特别是在施工现场,工人佩戴安全帽是确保人身安全的基本要求。然而,人工监督难免会有疏漏,尤其是在大型工地或复杂环境中,确保每个人都佩戴安全帽变得非…...

Windows内置的服务器IIS(Internet Information Services)托管网站

一. 安装IIS 打开控制面板:在开始菜单搜索“控制面板”并打开它。程序和功能:点击“程序”然后选择“程序和功能”。启用或关闭Windows功能:在左侧菜单中选择“启用或关闭Windows功能”。查找并勾选IIS:在弹出的窗口中&#xff0c…...

虚幻引擎结构之UObject

一. UObject 的介绍 UObject 是虚幻引擎中的核心基础类,所有其他游戏对象和资源类都直接或间接地继承自它。作为虚幻引擎的基石,UObject 提供了多项关键功能,包括内存管理、序列化、反射(introspection)、垃圾回收以及元数据支持。在虚幻引擎中,UObject 类的实例通常被称…...

js的Reflect对象

Reflect 对象是 JavaScript ES6 中引入的一个内建对象,它提供了一系列与对象操作相关的方法。这些方法与 Object 对象上的方法类似,但在行为上有一些差异,并且更加规范和统一。Reflect 对象并不是一个构造函数,不能被 new 操作符调…...

this指向了谁?

看函数在执行的时候是如何调用的, 1 如果这个函数是用普通函数调用模式来进行调用,它内部的this指向了window; 2 如果一个函数在调用的时候是通过对象方法模式来进行调用,则它内部的this就是我们的对象; 3 如果一个函数在调用的时候通过构…...

基于Resnet、LSTM、Shufflenet及CNN网络的Daily_and_Sports_Activities数据集仿真

在深度学习领域,不同的网络结构设计用于解决特定的问题。本文将详细分析四种主流网络结构:卷积神经网络(CNN)、残差网络(ResNet)、长短期记忆网络(LSTM)和洗牌网络(Shuff…...

mac系统vsCode中使用Better Comments在.vue文件里失效

问题:关于Better Comments默认在html、TS、JS中有效,在vue中无效,需要单独进行配置 windows系统可以参考友链Better Comments(注释高亮)在vue文件里失效的问题 关于Better Comments电脑的配置路径: Windows系统&…...

UE5.3 C++ Ceiusm中的POI 制作3DUI 结合坐标转化

一.核心思路WidgetComponent CesiumGloberAnchor 二.先制作POI 创建C Actor来制作,APOI。直接上代码 #pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CesiumGlobeAnchorComponent.h" #includ…...

一起学Git【第六节:查看版本差异】

git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…...

numpy np.newaxis介绍

np.newaxis 是 NumPy 中用于增加数组维度的关键字。它的作用是为数组插入一个新的维度,从而改变数组的形状(shape)。 基本用法 np.newaxis 等价于 None,可以作为索引使用,用于在指定位置增加一个维度。增加的维度的大…...

小程序配置文件 —— 16 项目配置文件和配置 sass

目录 项目配置文件配置 sass 项目配置文件 在创建项目的时候,每个项目的根目录生成两个 config.json 文件(project.config.json 和 project.private.config.json ),用于保存开发者在工具上做的个性化配置,例如和编译有…...

【yolov5】实现FPS游戏人物检测,并定位到矩形框上中部分,实现自瞄

介绍 本人机器学习小白,通过语言大模型百度进行搜索,磕磕绊绊的实现了初步效果,能有一些锁头效果,但识别速度不是非常快,且没有做敌友区分,效果不是非常的理想,但在4399小游戏中爽一下还是可以…...

概率统计与随机过程--作业5

一、推导题 二、计算题 1、某单位为了研究太阳镜销售和广告费用之间的关系,搜集了以下数据,使用回归分析方法得到线性回归模型: 广告费用(万元)x 2 5 6 7 22 25 28 30 22 18 销售量(个&#xf…...

“802.11g”,“802.11n”,“802.11ac”,“802.11ax”

802.11g、802.11n、802.11ac、802.11ax都是IEEE制定的无线局域网(WLAN)标准,它们各自具有不同的特点和性能。以下是对这四个标准的详细介绍: 1. 802.11g 定义:802.11g是IEEE制定的一种无线局域网标准,它提…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型(Vision-Language Models, VLMs),为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展,机器人仍难以胜任复杂的长时程任务(如家具装配),主要受限于人…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

ThreadLocal 源码

ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中,要设置一个操作在指定延迟后(例如3秒)执行,可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法,它接受两个参数: 要执行的函数&…...