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

C++入门基础知识157—【用一篇博文简单了解数据结构之红黑树】

成长路上不孤单😊😊😊😊😊😊

【14后😊///C++爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】

今日分享关于C++数据结构红黑树的相关内容!

关于【C++数据结构红黑树

目录:

  • 一、什么是数据结构
  • 二、什么是红黑树
  • 三、红黑树的性质
  • 四、红黑树的操作
  • 五、红黑树与其他平衡二叉树的区别
  • 六、红黑树的用途

一、什么是数据结构

数据结构是计算机存储、组织数据的方式,它是相互之间存在一种或多种特定关系的数据元素的集合‌。数据结构研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,通常包括数据的逻辑结构、数据的存储结构和数据的操作。‌

数据结构可以分为顺序存储结构和链式存储结构。顺序存储结构是指数据元素放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的;而链式存储结构是指数据元素放在任意的存储单元中,存储单元可以是连续的,也可以是不连续的。

常见的数据结构类型包括数组、链表、栈、队列、树和图等‌。数组是一种顺序存储的数据结构,适用于随机访问;链表是一种链式存储的数据结构,适用于插入和删除操作;栈是一种后进先出的数据结构,常用于函数调用和回溯算法;队列是一种先进先出的数据结构,常用于任务调度和缓冲;树是一种层次结构的数据结构,常用于表示数据的层级关系;图是一种网络结构的数据结构,常用于表示复杂的关系网络。

二、什么是红黑树

红黑树是一种自平衡的二叉查找树,是一种高效的查找树。它是由 Rudolf Bayer 于1972年发明,在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来,在1978年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的红黑树。红黑树具有良好的效率,它可在 O(logN) 时间内完成查找、增加、删除等操作。因此,红黑树在业界应用很广泛,比如 Java 中的 TreeMap,JDK 1.8 中的 HashMap、C++ STL 中的 map 均是基于红黑树结构实现的。

考虑到红黑树是一种被广泛应用的数据结构,所以我们很有必要去弄懂它。

三、红黑树的性质

红黑树的关键性质包括:

  1. 节点颜色‌:每个节点可以是红色或黑色。
  2. 根节点颜色‌:根节点必须是黑色。
  3. 叶子节点颜色‌:所有叶子节点(NIL节点)都是黑色的。
  4. 红色节点的子节点‌:每个红色节点的两个子节点必须是黑色的。
  5. 路径长度‌:从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

这些性质确保了红黑树的高度大致平衡,从而保证了在最坏情况下,查找、插入和删除操作的时间复杂度为O(log n),其中n是树中元素的数目。红黑树相对于AVL树,牺牲了部分平衡性以换取插入和删除操作时少量的旋转操作,整体性能优于AVL树。

有了上面的几个性质作为限制,即可避免二叉查找树退化成单链表的情况。但是,仅仅避免这种情况还不够,这里还要考虑某个节点到其每个叶子节点路径长度的问题。如果某些路径长度过长,那么,在对这些路径上的及诶单进行增删查操作时,效率也会大大降低。这个时候性质4和性质5用途就凸显了,有了这两个性质作为约束,即可保证任意节点到其每个叶子节点路径最长不会超过最短路径的2倍。原因如下:

当某条路径最短时,这条路径必然都是由黑色节点构成。当某条路径长度最长时,这条路径必然是由红色和黑色节点相间构成(性质4限定了不能出现两个连续的红色节点)。而性质5又限定了从任一节点到其每个叶子节点的所有路径必须包含相同数量的黑色节点。此时,在路径最长的情况下,路径上红色节点数量 = 黑色节点数量。该路径长度为两倍黑色节点数量,也就是最短路径长度的2倍。举例说明一下,请看下图:

四、红黑树的操作

在红黑树上只读操作不需要对用于二叉查找树的操作做出修改,因为它也是二叉查找树。但是,在插入和删除之后,红黑属性可能变得违规。恢复红黑属性需要少量(O(log n))的颜色变更(这在实践中是非常快速的)并且不超过三次树旋转(对于插入是两次)。这允许插入和删除保持为 O(log n))次,但是它导致了非常复杂的操作。

五、红黑树与其他平衡二叉树的区别

红黑树与AVL树相比,AVL树要求更严格的平衡条件,每次插入和删除操作都需要进行多次旋转来维护平衡,而红黑树通过较少的旋转和颜色变化来保持平衡,从而降低了维护平衡的开销‌

六、红黑树的用途 

1.Linux非实时任务调度中的应用

Linux 的稳定内核版本在 2. 6. 24 之后,使用了新的调度程序 CFS,所有非实时可运行进程都以虚拟运行时间为 key 值挂在一棵红黑树上,以完成更公平高效地调度所有任务。CFS 弃用 active /expired 数组和动态计算优先级,不再跟踪任务的睡眠时间和区别是否交互任务,并且在调度中采用基于时间计算键值的红黑树来选取下一个任务,根据所有任务占用 CPU 时间的状态来确定调度任务优先级。 

2.Linux虚拟内存中的应用

32 位 Linux 内核虚拟地址空间划分 0 - 3G 为用户空间,3 - 4G 为内核空间,因此每个进程可以使用 4GB的虚拟空间。同时,Linux 定义了虚拟存储区域( VMA) 以便于更好表示进程所使用的虚拟空间,每个 VMA是某个进程的一段连续虚拟空间,其中的单元具有相同的特征,所有的虚拟区域按照地址排序由指针链接为一个链表。当发生缺页中断时搜索 VMA 到指定区域时,则需要频繁操作,因此选用了红黑树以减少查找时间。 

3.检测树的平衡性上的应用

红黑树是一种自平衡二叉搜索树,它的每个结点都被“着色”为红色或者黑色,这些结点的颜色被用来检测树的平衡性。红黑树作为嵌入式数据库中的索引机制,可以获得更好的性能,对于SQLite数据库,可以采用红黑树实现索引机制的优化。

http://www.dtcms.com/a/410073.html

相关文章:

  • 做网站课程报告阜阳网站建设哪家好
  • 吃透 Java 中的 break 与 continue
  • 【Android之路】kotlin和Jatpack compose
  • 渗透测试入门:从网络抓包到Web安全基础
  • 阿里云CDN加速流量消耗大原因:动态加速
  • 云栖2025 | 阿里云自研大数据平台 ODPS 重磅升级:全面支持AI计算和服务
  • FreeRTOS内存分配与STM32内存布局详解
  • 外贸建站的公司wordpress如何汉化主题
  • phpcms网站系统 技术方案 系统框架图网站系统开发团队简介
  • vue3+ts项目实现陕西省3d地图
  • leetcode_146 LRU缓存
  • Python常用自动化测试框架—Pytest详解
  • 郑州英文网站建设软件开发平台搭建
  • 在 C# .NETCore 中使用 MongoDB(第 3 部分):跳过、排序、限制和投影
  • 建设网站入什么科目最大的商标交易平台
  • esp32墨水屏学习3
  • DOM(二):事件监听、事件类型、事件对象、环境对象、回调函数、Tab栏切换
  • net6.0 WebApi 中使用 Entity Framework Core + Sqlite
  • 前端2.0
  • PostIn入门到实战(4) - 如何使用接口Mock尽早满足前端开发需求
  • 【论文阅读 | TGRS 2025 | DHANet:用于多模态无人机目标检测的双流分层交互网络​​】
  • 零知IDE——STM32F407VET6与ADS1115模数转换器实现多通道数据采集显示系统
  • 门户网站 商城系统青岛建站开发
  • 从零学算法39
  • BIKE算法:后量子密码标准化竞赛中的编解码候选者
  • 【字节跳动】LLM大模型算法面试题:什么是 LangChain?LangChain 包含哪些 核心概念?
  • 降低fullgc停顿时间
  • BatchNorm2d详细原理介绍
  • Spring Boot WebSocket:使用 Java 构建多频道聊天系统
  • 中堂镇仿做网站软文网站有哪些