在回答这个问题之前,我们先了解一下有关二叉树的基本内容。

①二叉排序树(又称二叉查找树):

1)若左子树不为空,则左子树上所有结点的值均小于根结点的值。
2)若右子树不为空,则右子树上所有结点的值均大于根节点的值。
3)左右子树也为二叉排序树。

②平衡二叉树(AVL树):

是一种二叉查找树,当且仅当两个子树的高度差不超过1时,这个树是平衡二叉树。

③红黑树:

是许多二叉查找树中的一种,不严格的平衡二叉树,即不像AVL那样要求节点的 |balFact| <= 1,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决。它能保证在最坏的情况下,基本动态集合操作时间为O(lgn).

问题1:为什么不使用二叉排序树?

问题主要出现在二叉排序树在添加元素的时候极端情况下会出现线性结构。

举例说明:由于二叉排序树左子树所有节点的值均小于根节点的特点,如果我们添加的元素都比根节点小,会导致左子树线性增长,这样就失去了用树型结构替换链表的初衷,导致查询时间增长。所以这是不用二叉查找树的原因。

问题2:为什么不使用平衡二叉树呢?

①红黑树不追求"完全平衡",即不像AVL那样要求节点的 |balFact| <= 1,它只要求部分达到平衡,但是提出了为节点增加颜色,红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多。
就插入节点导致树失衡的情况,AVL和RB-Tree都是最多两次树旋转来实现复衡rebalance,旋转的量级是O(1)
删除节点导致失衡,AVL需要维护从被删除节点到根节点root这条路径上所有节点的平衡,旋转的量级为O(logN),而RB-Tree最多只需要旋转3次实现复衡,只需O(1),所以说RB-Tree删除节点的rebalance的效率更高,开销更小!
AVL的结构相较于RB-Tree更为平衡,插入和删除引起失衡,如2所述,RB-Tree复衡效率更高;当然,由于AVL高度平衡,因此AVL的Search效率更高啦。
针对插入和删除节点导致失衡后的rebalance操作,红黑树能够提供一个比较"便宜"的解决方案,降低开销,是对search,insert ,以及delete效率的折衷,总体来说,RB-Tree的统计性能高于AVL.
故引入RB-Tree是功能、性能、空间开销的折中结果。
② AVL更平衡,结构上更加直观,时间效能针对读取而言更高;维护稍慢,空间开销较大。
③ 红黑树,读取略逊于AVL,维护强于AVL,空间开销与AVL类似,内容极多时略优于AVL,维护优于AVL。
基本上主要的几种平衡树看来,红黑树有着良好的稳定性和完整的功能,性能表现也很不错,综合实力强,在诸如STL的场景中需要稳定表现。

问题3:为什么不使用b+树呢?

B+树在数据库中被应用的原因是其“矮胖”的特点,B+树的非叶子结点不存储数据,所以每个结点能存储的关键字更多。所以B+树更能应对大量数据的情况。jdk1.7中的HashMap本来是数组+链表的形式,链表由于其查找慢的特点,所以需要被查找效率更高的树结构来替换。如果用B+树的话,在数据量不是很多的情况下,数据都会“挤在”一个结点里面。这个时候遍历效率就退化成了链表。
结论:b+树不属于二叉树,因为二叉查找树的查找效率是最高的,如果内存能装下完整的树,最好使用二叉查找树,b+树是退而求其次的方式。

问题4:为什么不使用跳跃表呢?

跳跃表也可以很快的查询数据,但是 HashMap 的 各个Entry 之间并没有内在的排序关系,跳表需要元素之间存在排序关系,否则就无法跳跃查找不是吗?

TreeMap 的并发实现 ConcurrentSkipListMap 就是使用的跳表。

再者就是跳跃表因为要定义多级指针,是以空间换时间的数据结构,红黑树树不需要额外的空间。

hashmap中为什么使用红黑树?相关推荐

  1. 为什么HashMap中链表转红黑树的阀值是8?

    在JDK1.8以后,HashMap中引入红黑树,主要原因为: 当一个桶(Bucket)中的元素过度填充时,链表的查找效率将会大大下降,因此在适当的时候,转换链表为红黑树,可以在桶过度填充时提高查询效率 ...

  2. hashmap为什么要引入红黑树?

    hashmap为什么要引入红黑树? 在JDK1.6,JDK1.7中,HashMap采用位桶+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里.但是当位于一个桶中的元素较多,即has ...

  3. 为什么java1.8 hashMap的数据结构是红黑树?

    众所周知,java1.7的时候hashMap结构还是[数组+链表],而在1.8版本结构变为了[数组+链表/红黑树],当链表长度达到8时,自动转换为红黑树结构. 那么为什么java1.8要对hashMa ...

  4. HashMap之TreeNode(红黑树)源码分析

    HashMap-TreeNode源码分析(jdk1.8 HashMap之TreeNode源码分析 属性及构造方法 find() putTreeVal() removeTreeNode() treeif ...

  5. HashMap为什么要使用红黑树

    在JDK1.8之后,Java对HashMap做了改进,在链表长度大于8的时候,将后面的数据存到红黑树中,以加快检索速度. 红黑树也是一种平衡二叉树,每个节点有一个储存位表示节点的颜色,可以是红色或者黑 ...

  6. HashMap什么时候出现红黑树

    1.出现条件 满足:链表长度到8,并且数组长度到64 情况一:链表长度到满足8,先尝试转红黑树 TREEIFY_THRESHOLD:8 如下图所示,判断链表长度到达8,调用treeifyBin()方法 ...

  7. HashMap之链表转红黑树(树化 )-treefyBin方法源码解读(所有涉及到的方法均有详细解读,欢迎指正)

    PS:由于文档是我在本地编写好之后再复制过来的,有些文本格式没能完整的体现,故提供下述图片,供大家阅览,以便有更好的阅读体验:

  8. 红黑树-介绍/性质/定理/基本操作/特点

    一.什么是红黑树 红黑树就是一种平衡的二叉查找树,说他平衡的意思是他不会变成"瘸子",左腿特别长或者右腿特别长. 二.红黑树的性质 除了符合二叉查找树的特性之外,还具体下列的特性: ...

  9. 红黑树的优势_红黑树在不同场景的应用及其优势

    红黑树(平衡的排序二叉树),满足以下性质: 1)每个结点要么是红的,要么是黑的. 2)根结点是黑的. 3)每个叶结点,即空结点(NIL)是黑的. 4)如果一个结点是红的,那么它的俩个儿子都是黑的. 5 ...

最新文章

  1. Hive的“rowid”
  2. 搭建yum源,配置yum源
  3. 【Hisi音频】Hi3520D音频输出调试
  4. 微软过冬的三大姿势:裁员,回购400亿美元股票,在中国开合资公司
  5. NET流行高性能JSON框架-Json.NET
  6. 学习笔记-工业相机与普通相机优劣利弊
  7. Activity 启动模式
  8. java option_option 的经典属性
  9. mysql jdbc配置重连_Spring Boot 配置MySQL数据库重连的操作方法
  10. 【LeetCode】【字符串】题号:*389. 找不同
  11. ITIL4 服务管理的四个维度
  12. 图像处理ORL--训练集及测试集建立--Matlab实现
  13. 计算机网络经过了几个阶段,计算机网络的发展经过哪几个阶段?
  14. 川大 计算机学院 惠子,“挑战杯”四川大学2013年学生科技节之“纺兴未艾,织行天下”废物循环利用大赛决赛圆满落幕...
  15. Vue3 - 组件通信(父传子)
  16. Windows日志浅析
  17. 手机屏分几种?什么叫水滴屏、刘海屏、瀑布屏、全面屏?
  18. 20X25 FCPX插件24种视频网站点赞订阅关注MG动画效果 Youtube Subscribe Generators
  19. 分享申请IDP账号的过程,包含duns申请的分享
  20. 2021届双非本科的心酸秋招经历总结及经验分享

热门文章

  1. HDP2.5更换集群IP
  2. 百川授权淘宝登录 返回页面 关闭
  3. vm安装xp系统提示system not found,一直网卡形式启动
  4. 修改文件的所有者和所在组
  5. 内容分发技术平台_内容分发平台及排名_编辑机器人|Giiso智搜
  6. 量化版——使用TF Lite将Mobilenet SSD目标检测移植至安卓客户端
  7. STM32CubeMX新建Project、下载库
  8. 电脑爱好者GHOSTWIN7纯净版V1.0
  9. 对Navigation基础的了解
  10. scala的Seq与java的List相互转换