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 均是基于红黑树结构实现的。
考虑到红黑树是一种被广泛应用的数据结构,所以我们很有必要去弄懂它。
三、红黑树的性质
红黑树的关键性质包括:
- 节点颜色:每个节点可以是红色或黑色。
- 根节点颜色:根节点必须是黑色。
- 叶子节点颜色:所有叶子节点(NIL节点)都是黑色的。
- 红色节点的子节点:每个红色节点的两个子节点必须是黑色的。
- 路径长度:从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
这些性质确保了红黑树的高度大致平衡,从而保证了在最坏情况下,查找、插入和删除操作的时间复杂度为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数据库,可以采用红黑树实现索引机制的优化。