Java中TreeSet操作的计算复杂度?

Posted

技术标签:

【中文标题】Java中TreeSet操作的计算复杂度?【英文标题】:Computational complexity of TreeSet operations in Java? 【发布时间】:2011-03-24 08:34:58 【问题描述】:

我试图澄清一些有关 TreeSet 某些操作的复杂性的事情。在 javadoc 上它说:

"这个实现提供了 保证 log(n) 时间成本 基本操作(添加、删除和 包含)。”

到目前为止一切顺利。我的问题是在 addAll()、removeAll() 等上会发生什么。这里 Set 的 javadoc 说:

"如果指定的集合也是一个 set, addAll 操作有效 修改此集合,使其值为 两个集合的并集。”

它只是解释操作的逻辑结果还是暗示了复杂性?我的意思是,如果这两个集合由例如红黑树 以某种方式加入树比将一个的每个元素“添加”到另一个更好。

无论如何,有没有办法将两个 TreeSet 组合成一个复杂度为 O(logn) 的树集?

提前谢谢你。 :-)

【问题讨论】:

回复我得到的答案:我不太明白这个。假设您有两个 SortedSet,它们没有重叠的元素并由红黑树表示。红黑树中的“加入”操作需要 O(log(n+m)) 时间,为什么不能加入它们? 【参考方案1】:

您可以想象如何将特殊情况优化为O(log n),但最坏的情况必须是O(m log n),其中mn 是每棵树中元素的数量。

编辑:

http://net.pku.edu.cn/~course/cs101/resource/Intro2Algorithm/book6/chap14.htm

描述了一种特殊情况算法,它可以连接O(log(m + n)) 中的树,但请注意限制:S1 的所有成员必须小于S2 的所有成员。这就是我的意思,有针对特殊情况的特殊优化。

【讨论】:

这里是链接:oreilly.com/library/view/data-structures-and/9788131755679/… 链接返回 403。【参考方案2】:

根据这篇博文:http://rgrig.blogspot.com/2008/06/java-api-complexity-guarantees.html 它是 O(n log n)。由于文档没有提供有关复杂性的提示,因此如果性能对您至关重要,您可能需要编写自己的算法。

【讨论】:

【参考方案3】:

查看 TreeSet 的 java 源代码,如果传入的集合是 SortedSet,那么它使用 O(n) 时间算法。否则它会调用 super.addAll,我猜这会导致 O(n logn)。

编辑 - 我猜我读代码太快了,TreeSet 只能使用 O(n) 算法,如果它的后备图是空的

【讨论】:

【参考方案4】:

不可能像在不相交集数据结构中那样执行树的合并或连接集,因为您不知道两棵树中的元素是否不相交。由于数据结构了解其他树中的内容,因此有必要在将一个元素添加到另一棵树之前检查它是否存在于另一棵树中,或者至少尝试将其添加到另一棵树中并在找到它时中止添加它方式。 所以,应该是O(MlogN)

【讨论】:

我不太明白这一点。假设您有两个 SortedSet,它们没有重叠的元素并由红黑树表示。红黑树中的“加入”操作需要 O(log(n+m)) 时间,为什么不能加入它们? 给定 2 个任意的 TreeSet,你将如何确定是否是这种情况? 嗯,根据我目前正在制作的程序,我可以保证两个 TreeSet 不会有任何重叠的元素。但是,正如其他答案所指出的那样,我似乎无法将它们加入 O(log(n+m)) ......

以上是关于Java中TreeSet操作的计算复杂度?的主要内容,如果未能解决你的问题,请参考以下文章

TreeSet 源码分析

java面试题9

java容器

Java 容器

如何计算Java中操作的耗时?

深入理解红黑树