为什么选择红黑树作为底层实现

红黑树是一种类平衡树, 但它不是高度的平衡树, 但平衡的效果已经很好了. 补充说明另一种 AVL 树, 我之前的博文: 《编程珠玑,字字珠玑》读书笔记完结篇——AVL树

用过 STL map 么, 你用过 linux 么(这个说大了), 他们都有红黑树的应用. 当你对搜索的效率要求较高,并且数据经常改动的情景,你可以用红黑树, 也就是 map.

至于, 为什么不用 AVL 树作为底层实现, 那是因为 AVL 树是高度平衡的树, 而每一次对树的修改, 都要 rebalance, 这里的开销会比红黑树大. 红黑树插入只要两次旋转, 删除至多三次旋转. 但不可否认的是, AVL 树搜索的效率是非常稳定的. 选取红黑树, 我认为是一种折中的方案.

黑体字是不正确的,对AVL插一个node或者删一个node,显然不需要每次都做rotation来维持balance。且AVL插入最多也只需要2次旋转。

下面是我的回答:

1. 如果插入一个node引起了树的不平衡,AVL和RB-Tree都是最多只需要2次旋转操作,即两者都是O(1);但是在删除node引起树的不平衡时,最坏情况下,AVL需要维护从被删node到root这条路径上所有node的平衡性,因此需要旋转的量级O(logN),而RB-Tree最多只需3次旋转,只需要O(1)的复杂度。

2. 其次,AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。

3. map的实现只是折衷了两者在search、insert以及delete下的效率。总体来说,RB-tree的统计性能是高于AVL的。


最坏情况下,AVL树有最多O(logN)次旋转,而红黑树最多三次。当然,这是个结论,谁能给出一个证明啊。。

为什么选择红黑树作为底层实现相关推荐

  1. C++ 第八节数据结构 第七节 ——二叉搜索树 AVL树 红黑树(底层原理图+模拟实现)

    第一次,C++和数据结构联合推出,倾情献上呦~~ 给个关注吧 23333~~~~~~(现在每天系统就给我一个机器人的粉丝量了55555~~~~~) 本节内容,我们将着重来探讨 二叉树 中特殊的两种树- ...

  2. HashMap为什么选择红黑树?

    为什么不选择AVL树? RB-Tree和AVL树作为BBST,其实现的算法时间复杂度相同,AVL作为最先提出的BBST,貌似RB-tree实现的功能都可以用AVL树是代替,那么为什么还需要引入RB-T ...

  3. 红黑树( 图解 + 秒懂 + 史上最全)

    文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :<尼恩Java面试宝典>持续更新+ 史上最全 + 面 ...

  4. 自己手写HashMap——红黑树的Java实现

    0.引言 (1)HashMap简单介绍 你好,这篇文章是<自己手写HashMap>的第一篇. 在java7之前,HashMap是用数组(hash桶)+链表的形式实现的,大概的原理就是对ke ...

  5. 关于hash,hashCode, hashMap,红黑树

    小刘老师讲HashMap源码 小刘老师讲红黑树 hash,hashCode,hashMap 1.前提知识 数组: 列表: 散列表 什么是hash? hash也称散列,哈希,基本原理就是把任意长度的输入 ...

  6. HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理

    HashMap底层实现原理,红黑树,B+树,B树的结构原理,volatile关键字,CAS(比较与交换)实现原理 首先HashMap是Map的一个实现类,而Map存储形式是键值对(key,value) ...

  7. 底层实现红黑树_stl map底层之红黑树插入步骤详解与代码实现 | 学步园

    本篇文章并没有详细的讲解红黑树各方面的知识,只是以图形的方式对红黑树插入节点需要进行调整的过程进行的解释. 最近在看stl源码剖析,看到map底层红黑树的实现.为了加深对于红黑树的理解就自己动手写了红 ...

  8. 底层实现红黑树_图解:红黑树

    注:本文比较硬核但是很值得大家花心思看完,看完你一定会有所收获的 红黑树是面试中一个很经典也很有难度的知识点,网传字节跳动面试官最喜欢问这个问题.很多人会觉得这个知识点太难,不想花太多功夫去了解,也有 ...

  9. B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找?

    B-Tree/B+-Tree/二叉树/红黑树/Hash表/MySQL底层到底用哪个数据表建立索引做快速查找? ~~B-Tree~~ ==B+Tree== ~~二叉树(Binary Search Tre ...

  10. Java--敲重点!JDK1.8 HashMap特性及底层数组+单链表+红黑树知识(建议收藏)

    ❤️‍大家好,我是贾斯汀!❤️‍ 学习目录 学习背景 HashMap特性 HashMap添加元素四步曲 前奏:HashMap如何添加一个元素? 第一步曲:根据key得到hashCode值 第二步曲:根 ...

最新文章

  1. 文件系统类型是ntfs无法确定卷版本和状态_硬盘写到一半时断电,文件系统里会发什么?...
  2. openfalcon 组件监控_运维监控系统之Open-Falcon
  3. VHDL中的分辨函数
  4. 约瑟夫问题(java实现)
  5. 三十、详测 Generics Collections: TObjectList、TObjectQueue、TObjectStack
  6. json和python中字典的区别和联系_Python中 json字符串和字典的区别
  7. IDEA启动hadoop报Could not locate executable null\bin\winutils.exe in the Hadoop binaries.错误的解决办法
  8. 【Kafka】消息超过最大值限制max.request.size
  9. 前端系统化学习【JS篇】:(四-1)基本数据类型之Number篇
  10. 合成资产平台Public Mint与跨链资产协议Knit Finance达成合作
  11. 如何提取网页中所有链接(C++) 转载
  12. python一行代码制作20款经典游戏
  13. 驾驶证期满换证流程(杭州篇)
  14. linux查看压缩文件的大小,Linux下不解压压缩文件如何直接查看某个文件大小
  15. android 图片释放内存吗,手机内存不足?掌握这几招让手机瞬间释放几个G!
  16. github windows系统监控_你需要的:Windows | 精品软件集
  17. 最容易读进去的深度学习科普贴
  18. 千锋教育威哥学Java教程之Java基础学习路线
  19. google日历的农历循环提醒
  20. 超参数及其优化办法:验证集

热门文章

  1. 只会编程的程序员没有前途
  2. [leetcode] Sudoku Solver
  3. VC++ chap19 动态链接库 VC++ 孙鑫
  4. linux 远程连接ssh提示IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY解决
  5. 广州海珠php培训_海珠|海珠区第二实验小学教育集团成立两周年 初步实现集团内教师资源的“柔性流动”...
  6. 3.2自编码器(变分自编码器,VAE)
  7. 任正非谈鸿蒙系统研究,任正非谈鸿蒙系统 有优势 有信心打造生态
  8. aes sm1 对比_加密算法比较3DES AES RSA ECC MD5 SHA1等
  9. Android布局基础知识
  10. Python入门经典学习1-乳腺癌分类问题