为啥基于 Java TreeMap 的红黑树实现?
Posted
技术标签:
【中文标题】为啥基于 Java TreeMap 的红黑树实现?【英文标题】:Why red-black tree based implementation for java TreeMap?为什么基于 Java TreeMap 的红黑树实现? 【发布时间】:2013-02-02 02:56:24 【问题描述】:wikipedia's article on AVL trees 的第三段说:“因为 AVL 树更严格地平衡,所以对于查找密集型应用程序来说,它们比红黑树更快。”
那么,TreeMap 不应该使用 AVL 树而不是红黑树来实现(因为基于散列的数据结构会有更多的查找密集型应用程序)?
【问题讨论】:
AVL 树的旋转标准比红黑树更严格,因此插入和删除比红黑树慢。 【参考方案1】:从历史上看,旋转次数被认为非常重要,因此选择了红黑树而不是 AVL,因为红黑树在随机插入时执行的旋转略少 - 每个插入的平均旋转 0.6 对 0.7。
事后看来,AVL 树可能是更好的选择。您可以在此处查看 Java 中 AVL 和红黑树的性能比较: https://refactoringlightly.wordpress.com/2017/10/29/performance-of-avl-red-black-trees-in-java/
随机插入的性能是相似的。使用顺序数据时,AVL 树的性能要好得多 - 30% 或更多。
【讨论】:
【参考方案2】:红黑树更通用。它们在添加、删除和查找方面做得相对较好,但 AVL 树的查找速度更快,但添加/删除速度较慢。 Java 的一般策略是提供最好的通用数据结构。这也是 Java 的默认 Array.sort(Object[] a) 实现是稳定的、自适应的、迭代合并排序而不是快速排序的原因。
【讨论】:
Java 对原始对象使用快速排序,因为在一般情况下它比合并排序更快。它使用归并排序对对象进行排序,因为归并排序是一种稳定的排序算法。见:***.com/questions/3707190/… 由于 Java 7 合并排序被 TimSort bugs.java.com/bugdatabase/view_bug.do?bug_id=6804124取代【参考方案3】:***的文章是错误的(或者至少,没有支持引用来支持该声明)。确实,AVL 树的最坏情况高度(1.44 lg n)优于红黑 BST 的最坏情况高度(2 lg n),但这是最坏情况,可能没什么可做的具有真实世界的性能。
【讨论】:
以上是关于为啥基于 Java TreeMap 的红黑树实现?的主要内容,如果未能解决你的问题,请参考以下文章