STL 之红黑树

STL 简单红黑树的实现 1.红黑树简介 二叉搜索树能够提供对数的元素插入和访问。二叉搜索树的规则是:任何节点的键值一定大于其左子树的每一个节点值,并小于右子树的每一个节点值。 常见的二叉搜索树有AVL-tree、RB-tree(红黑树)。红黑树具有极佳的增、删、查性能,故我们选择红黑树作为关联式容器(associative containers)的底层结构。 红黑树是每个节点都带有颜色属性的二叉查找树,颜色或红色或 阅读详情

R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(Black)。

红黑树的特性:
(1)每个节点或者是黑色,或者是红色。
(2)根节点是黑色。
(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
(4)如果一个节点是红色的,则它的子节点必须是黑色的。
(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。

注意:
(01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。
(02) 特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。

红黑树示意图如下:

 

红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。

定理: 一棵含有n个节点的红黑树的高度至多为2log(n+1).

 

1.stl中的set底层用的什么数据结构?

红黑树

 

2.红黑树的数据结构怎么定义?

  1. enum Color  
  2. {  
  3.           RED = 0,  
  4.           BLACK = 1  
  5. };  
  6.   
  7. struct RBTreeNode  
  8. {  
  9.            struct RBTreeNode*left, *right, *parent;  
  10.            int   key;  
  11.            int data;  
  12.            Color color;  
  13. };  

 

3.红黑树有哪些性质?

一般的,红黑树,满足以下性质,即只有满足以下全部性质的树,我们才称之为红黑树:
1)每个结点要么是红的,要么是黑的。
2)根结点是黑的。
3)每个叶结点(叶结点即指树尾端NIL指针或NULL结点)是黑的。
4)如果一个结点是红的,那么它的俩个儿子都是黑的。
5)对于任一结点而言,其到叶结点树尾端NIL指针的每一条路径都包含相同数目的黑结点。

 

4.红黑树的各种操作的时间复杂度是多少?

能保证在最坏情况下,基本的动态几何操作的时间均为O(lgn)

 

5.红黑树相比于BST和AVL树有什么优点?

红黑树是牺牲了严格的高度平衡的优越条件为代价,它只要求部分地达到平衡要求,降低了对旋转的要求,从而提高了性能。红黑树能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。此外,由于它的设计,任何不平衡都会在三次旋转之内解决。当然,还有一些更好的,但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡,但红黑树能够给我们一个比较“便宜”的解决方案。

相比于BST,因为红黑树可以能确保树的最长路径不大于两倍的最短路径的长度,所以可以看出它的查找效果是有最低保证的。在最坏的情况下也可以保证O(logN)的,这是要好于二叉查找树的。因为二叉查找树最坏情况可以让查找达到O(N)。

红黑树的算法时间复杂度和AVL相同,但统计性能比AVL树更高,所以在插入和删除中所做的后期维护操作肯定会比红黑树要耗时好多,但是他们的查找效率都是O(logN),所以红黑树应用还是高于AVL树的. 实际上插入 AVL 树和红黑树的速度取决于你所插入的数据.如果你的数据分布较好,则比较宜于采用 AVL树(例如随机产生系列数),但是如果你想处理比较杂乱的情况,则红黑树是比较快的

 

6.红黑树相对于哈希表,在选择使用的时候有什么依据?

权衡三个因素: 查找速度, 数据量, 内存使用,可扩展性。
  总体来说,hash查找速度会比map快,而且查找速度基本和数据量大小无关,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n) 小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash。但若你对内存使用特别严格, 希望程序尽可能少消耗内存,那么一定要小心,hash可能会让你陷入尴尬,特别是当你的hash对象特别多时,你就更无法控制了,而且 hash的构造速度较慢。

红黑树并不适应所有应用树的领域。如果数据基本上是静态的,那么让他们待在他们能够插入,并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的,例如,做一个哈希表,性能可能会更好一些。

在实际的系统中,例如,需要使用动态规则的防火墙系统,使用红黑树而不是散列表被实践证明具有更好的伸缩性。Linux内核在管理vm_area_struct时就是采用了红黑树来维护内存块的。

红黑树通过扩展节点域可以在不改变时间复杂度的情况下得到结点的秩。

 

7.如何扩展红黑树来获得比某个结点小的元素有多少个?

这其实就是求节点元素的顺序统计量,当然任意的顺序统计量都可以需要在O(lgn)时间内确定。

在每个节点添加一个size域,表示以结点 x 为根的子树的结点树的大小,则有

size[x] = size[[left[x]] + size [right[x]] + 1;

这时候红黑树就变成了一棵顺序统计树。

利用size域可以做两件事:

1). 找到树中第i小的结点;

  1. OS-SELECT(x;,i)  
  2. r = size[left[x]] + 1;  
  3. if i == r  
  4.      return x  
  5. elseif i < r  
  6.      return OS-SELECT(left[x], i)  
  7. else return OS-SELECT(right[x],  i)  


思路:size[left[x]]表示在对x为根的子树进行中序遍历时排在x之前的个数,递归调用的深度不会超过O(lgn);

 

 

2).确定某个结点之前有多少个结点,也就是我们要解决的问题;

 

  1. OS-RANK(T,x)  
  2. r = x.left.size + 1;  
  3. y = x;  
  4. while y != T.root  
  5.          if y == y.p.right  
  6.                  r = r + y.p.left.size +1  
  7.          y = y.p  
  8. return r  


 

 

思路:x的秩可以视为在对树的中序遍历种,排在x之前的结点个数加上一。最坏情况下,OS-RANK运行时间与树高成正比,所以为O (lgn).

 

8.扩展数据结构有什么步骤?

1).选择基础数据结构;

2).确定要在基础数据结构种添加哪些信息;

3).验证可用基础数据结构上的基本修改操作来维护这些新添加的信息;

4).设计新的操作。

9 为什么一般hashtable的桶数会取一个素数

设有一个哈希函数
H( c ) = c % N;
当N取一个合数时,最简单的例子是取2^n,比如说取2^3=8,这时候
H( 11100(二进制) ) = H( 28 ) = 4
H( 10100(二进制) ) = H( 20 )= 4

这时候c的二进制第4位(从右向左数)就”失效”了,也就是说,无论第c的4位取什么值,都会导致H( c )的值一样.这时候c的第四位就根本不参与H( c )的运算,这样H( c )就无法完整地反映c的特性,增大了导致冲突的几率.

取其他合数时,都会不同程度的导致c的某些位”失效”,从而在一些常见应用中导致冲突.
但是取质数,基本可以保证c的每一位都参与H( c )的运算,从而在常见应用中减小冲突几率..

C++ STL源码剖析之红黑树 C++ STL源码剖析之红黑树导语红黑树节点基类红黑树节点红黑树迭代器红黑树操作红黑树插入旋转过程插入总结使用 导语 在STL源码中有两段话,简单翻译后如下: STL中Red-black tree(红黑树)class,用来当做SLT关系式容器(如set,multiset,map, multimap).里面所用的insertion和deletion方法以 《Introduction to Algorithms》一书为基础,但是有以下两点不同: (1)header不仅指向root,也指向红黑树的最左节点,以便用 阅读详情

相关推荐

DP链路训练从HPD触发到通道对齐:原理与调试实战

高速数字接口的稳定工作依赖物理层信号的精确协商,链路训练正是DisplayPort接口中确保源端与接收端在速率、摆幅和时序上达成一致的关键机制。HPD作为链路状态变化的触发信号,与通道对齐一同构成了训练流程的首尾环节。理解从时钟恢复到均衡再到多通道对齐的完整过程,有助于快速定位显示异常问题。在工程实践中,借助DPCD寄存器交互和AUX通道日志,可以系统性地排查训练失败原因。围绕链路训练全流程进行剖析,重点探讨HPD触发机制、训练图案选择、寄存器配置以及链路降级策略,为显示方案开发与调试提供工程参考。

weixin_30110543的博客 235

面试必备的红黑树,这可能是最容易理解的一篇了!

点击上方“Java之间”,选择“置顶或者星标”你关注的就是我关心的!来源:linux内核红黑树是一个平衡的二叉树,但不是一个完美的平衡二叉树。虽然我们希望一个所有查找都能...

Java之间 3842

EEG | CHB-MIT癫痫数据集CNN分类实战(一)

CHB-MIT癫痫数据集CNN分类实战

Always learn from the best. 1万+

面试篇:HashMap

HashMap夺命连问

viperd的博客 3822

那些年对支付宝的研究[整理]

支付宝功能强大.他内部各个功能间的跳转是通过Uri 实现的.而使用window.location.href 即可.跟浏览器一样的协议.很方便 H5启动支付宝: alipays://platformapi/startapp?appId=20000067&url=网址 alipays://platformapi/startapp?appId=20000691&url=网址 ali...

技术专研 8917

低成本实现webhook接收端[python]

Webook本质上也是API,只不过是反向调用,即前端不主动发送请求,完全由后端推送。简单来说,Webhook是一个接受HTTP POST或是GET,PUT,DELETE的URL,一个实现了Webhook的API提供商就是在当事件发生的时候会向配置的URL发送信息,与请求-响应式不同,使用Webhook可以实时接收到变化。Ps:Webhook可能会发出大量的请求,确保接受的URL不被泄露或者应用能及时处理这些请求。

锡城小凯的博客 1万+

面试中的红黑树,如何回答?

就是上面这个玩意叫红黑树,算是最难掌握的一种数据结构了,尤其是它的实现。在面试时候,如果涉及到红黑树的问题,作为一名应聘者,如何去回答比较好。 红黑树在我所有面试里占了5%,很少有公司会问到,如果碰到了我一般都会用这样回答: 红黑树是一种平衡二叉查找树。它是为了解决普通二叉查找树在数据更新的过程中复杂度退化的问题而产生的。红黑树的高度近似 log2n,所以它...

JOBbaba的博客 7548

PCIe 6.0 – 关于 PCI Express Gen6 您需要知道的一切

幸运的是,PCIe 6.0 FEC 足够轻,对延迟的影响最小。在电气层上,PCIe 6.0 使用 PAM4 信号(“四级脉冲幅度调制”),每个时钟周期将 2 位组合为 4 个幅度级别(00、01、10、11),与 PCIe 5.0 和前几代相比,它使用 NRZ 调制,每个时钟周期 1 位和两个幅度级别 (0, 1)。虽然 PAM4 信号更容易出错,但由于调制技术的性质,与 PCIe 5.0 相比,通道损耗不受影响,因此 PCB 上 PCIe 6.0 信号的范围将与 PCIe 5.0 相同。

qq_43416206的博客 3433

红黑树面试

———————————— ———————————— 二叉查找树(BST)具备什么特性呢? 1.左子树上所有结点的值均小于或等于它的根结点的值。 2.右子树上所有结点的值均大于或等于它的根结点的值。 3.左、右子树也分别为二叉排序树。 下图中这棵树,就是一颗典型的二叉查找树: ...

Pastxu的小屋 1372

使用MATLAB和Simulink来创建一个智能家居照明控制系统的仿真模型

智能家居中的智能照明控制系统旨在通过自动化手段优化家庭照明,提高能源效率和居住舒适度。这通常涉及传感器(如光敏传感器、运动传感器)、控制器(如微控制器或PLC)以及执行器(如调光器或开关)。在这个教程中,我们将使用MATLAB和Simulink来创建一个智能家居照明控制系统的仿真模型。

xiaoheshang_123的博客 221

RK3568平台开发系列讲解:Linux wifi的调试

查询结果中state为ENABLE,表示hostapd程序启用成功。首先查看设备是否存在。

内核笔记 168

面试题:什么是红黑树【不看后悔一生】

1、引入红黑树 今天在学习集合list、set和map的时候,发现set的一个实现类TreeSet和map的一个实现类TreeMap的底层数据结构都是红黑树,于是我仔细查阅了资料了解了什么是红黑树?

黑桃A的博客 4811

PCL 法向量夹角剔除错误匹配点对【2026最新版】

实现了一种简单的基于对应点法线角度的对应关系去除方法。博客长期更新,本文最新更新时间为:2026年5月24日。

点云侠的博客 41万+

再也不用担心STL的红黑树了。。。

C++ STL源码剖析之红黑树0.导语在STL源码中有两段话,简单翻译后如下:STL中Red-black tree(红黑树)class,用来当做SLT关系式容器(如set...

Francis的博客 838

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

STL红黑树

红黑树 红黑树根据红连接的位置可以分为偏左红黑树和偏右红黑树。这两种树分别对应了2-3树和2-3-4树,本篇文章只对偏左红黑树 偏左红黑树 概念 偏左红黑树是基于2-3树的思想的一种实现:红黑树是二叉树其中引入了红黑链接的概念,红链接对应2-3树中的3-结点,黑链接对应2-3树中的2-结点(普通节点) 性质 1.红链接均为左连接 2.没有任何一个结点同时与两条红链接相连(1条红链接连接的两个结点构成1个3-结点,两条就是4-结点) 3.红黑树是黑色平衡,任意空连接到根结点的路径上的黑链接数目相等 4.根结点

mxy568767179的博客 529

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【STL】STL中红黑树的应用set、multiset、map、multimap

上一篇博客介绍了红黑树的实现,下面介绍红黑树的应用,在STL中容器set和map,以及multiset和multimap底层实现都是红黑树。setset的底层就是用红黑树实现的,set的特性,所有元素都会根据元素的键值自动地排序。set元素的键值就是实值。set不允许两个元素有相同的键值。迭代器1、set不能通过迭代器修改set元素值。 因为set元素值就是键值关系到set元素排序规则,迭代器底层

菜鸟成长记 3046

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

STL中的红黑树

STL中的set、map都通过红黑树实现。红黑树的类型实际上是可以拿出来用的。用起来也是容易的。因为不是标准规定的容器,具体的名字可能会略有的差别。 例子最后演示了迭代器find()。这个地方语法上可以修改,但不能随便修改,因为会破坏key的排序。 #include <stdio.h> #include <set> using namespace std; typedef _Rb_tree<int, int, _Identity<int>, less<in

aaasssdddd96的博客 540

c++ STL 红黑树实现

红黑树是一种自平衡二叉查找树,它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。   红黑树应用: 1.linux内核中,进程的虚拟地址区间由红黑树组织管理 2.nginx中,超时时间由红黑树组织管理 3.C++ STL中,C++中set,multiset,map,multimap集合模板类都是在STL

永无止境 2331

如何使用 c++ stl 中的 map 以及红黑树 (一)

 Two Sum Given an array of integers, find two numbers such thatthey add up to a specific target number. The function twoSum should return indices of the twonumbers such that they add up

博客 8163

从零开始手写STL库:红黑树

红黑树的构建实际上是非常深入的一个工作,理论上讲应该按照:二叉搜索树-二叉平衡搜索树-红黑树 这样的顺序进行学习而且内容多,知识杂,在408考试里也属于是边缘且难度极大的内容了,一篇博客属实无法全部讲解清楚注意红黑树的五条性质即可。

weixin_48013375的博客 1764

【面经笔记】红黑树的特性与其在C++ STL中的应用

AVL树和红黑树适合内部存储应用,B树适合外部存储应用AVL树和红黑树都是用旋转保持平衡,AVL树对每个插入操作最多需要两次次旋转(单/双旋),对每个删除操作最多需要O(logn)次旋转;而红黑树对每个插入和删除操作,任何不平衡都会在三次旋转之内解决。查找、插入、删除的时间均为log(n),红黑树的算法时间复杂度和AVL相同,但红黑树的统计性能要好于平衡二叉树,但极端性能略差。平衡二叉树/AVL树:

xiaxzhou的博客 3349

STL源码分析之红黑树

主要分析一下STL里的红黑树,红黑树相对来说是一种较为复杂的数据结构,具体的学习方法建议看那种带有很多图解的博客,先理解其原理流程,再自己写下代码,其实就能理解了。STL里红黑树的实现有几个特点,一个它设置了一个空头结点header,它的左节点指向树最小元素,有节点指向树最大元素,实际带有有意义值的头结点为root,root的父节点为header.这使在一些插入删除操作时要讨论下特殊情况,附上代码...

sydney__的博客 276

STL map / set 底层机制: 红黑树完全剖析

前言: 在 STL 的容器中两大阵营 (vector deque list forward_list) 顺序容器 与 关联容器 (map set unorder_map unorder_set) 。 关联容器指的是以关键字匹配指定数据的一种关联数据结构的集合, 在关联容器中通过关键字去查找对应的数据是非常块的, 下面我们会彻底地去剖析其底层实现机制 : 红黑树。 由基础树 到 二叉搜索树 介绍红黑树之前,容许我介绍树的概念。 1. 树(tree), 在计算机科学中,是十分基础的数据结构: .

专注游戏研发 3365

STL RB Tree(红黑树)分析

红黑树的概念和条件,以及SGI STL中对RB Tree迭代器和数据结构以及一些重要函数的实现进行简要的说明。

UPing In The Road 2304

stl源码剖析_C++ STL源码剖析之红黑树

C++ STL源码剖析之红黑树0.导语大家好我是光城,欢迎关注公众号:guangcity。在STL源码中有两段话,简单翻译后如下:STL中Red-black tree(红黑树)class,用来当做SLT关系式容器(如set,multiset,map, multimap).里面所用的insertion和deletion方法以 《Introduction to Algorithms》一书为基础,但是有...

weixin_39777163的博客 344
上一篇: STL 之 deque
下一篇: c++ 知识点总结:
lfc2017
博客等级 码龄9年 2粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值