【问题标题】:How does TreeSet maintain O(logN) for add?TreeSet 如何维护 O(logN) 以进行添加?
【发布时间】:2019-11-14 04:50:19
【问题描述】:

Java TreeSet 类可以为 add 方法维护 O(logN) 成本。如果按排序顺序输入数据,这将如何工作?

既然二叉搜索树的 add 方法在给定排序数据时会退化到 O(N),为什么 TreeSet 不会发生这种情况?

【问题讨论】:

    标签: java tree binary-search-tree treeset


    【解决方案1】:

    您的错误是认为TreeSet 使用简单二叉搜索树。
    它没有。它使用自平衡二叉搜索树。

    TreeSet 的 Javadoc 说:

    NavigableSet 实现基于TreeMap

    TreeMap 的 Javadoc 说:

    基于NavigableMap 实现的红黑树。 [...]

    此实现为 containsKeygetputremove 操作提供有保证的 log(n) 时间成本。算法改编自 Cormen、Leiserson 和 Rivest 的Introduction to Algorithms中的算法。

    因此,如果您想查看特定算法的描述,请找到那本书并阅读它。

    您也可以做一些research 并查看红黑树的工作原理,例如见Wikipedia,上面写着:

    红黑树是计算机科学中的一种self-balancing binary search tree

    [...]

    树的平衡并不完美,但足以让它保证在O(log n)时间搜索,其中n是树中元素的总数。插入和删除操作,以及树的重新排列和重新着色,也在O(log n)时间执行。

    然后详细描述所有工作原理。

    【讨论】:

      【解决方案2】:

      欢迎来到 StackOverflow!

      给定排序数据时,二叉搜索树的 add 方法将退化为 O(N)

      对于 TreeSet 类,情况并非如此。

      TreeSet 类的实现依赖于红黑树 数据结构。基本上,在将新元素添加到红黑树之后,树会按照一些规则重新平衡。

      我推荐阅读Insertion section of the wikipedia page关于这个主题!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-22
        • 2020-01-29
        相关资源
        最近更新 更多