设定时间和速度的复杂性

时间:2011-07-09 12:47:37

标签: java algorithm collections

我正在刷新算法和数据结构,并且有一些问题以及我希望你检查的陈述。

ArrayList - O(1)(size,get,set,...),O(n) - 添加操作。
LinkedList - 除了检索第n个元素O(n)之外的所有操作O(1)(包括add())。我假设size()操作也在O(1)中运行,对吗?

TreeSet - 所有操作O(lg(N))。 size()操作需要O(lg(n)),对吗?

HashSet - 如果应用了正确的哈希函数,则所有操作O(1) HashMap - 所有操作O(1),与HashSet无关。

非常欢迎任何进一步的解释。提前谢谢。

2 个答案:

答案 0 :(得分:16)

ArrayList.add() 摊销 O(1)。如果操作不需要调整大小,则为O(1)。如果 需要调整大小,则为O(n),但随后增加大小,以便下一次调整大小不会发生一段时间。

来自Javadoc

  

添加操作以分摊的常量时间运行,即添加n个元素需要O(n)时间。所有其他操作都以线性时间运行(粗略地说)。与LinkedList实现相比,常数因子较低。

在性能分析方面,文档通常非常适合Java集合。

哈希算法的O(1)不仅仅是应用“适当的”哈希函数 - 即使使用非常好的哈希函数,你仍然可能碰巧遇到哈希冲突。 通常的复杂度是O(1),但当然如果所有哈希碰巧发生冲突,它可以是O(n)。

(另外,这将散列的成本计算为O(1) - 实际上,如果你正在散列字符串,那么对hashCode的每次调用都可能是字符串长度的O(k) 。)

答案 1 :(得分:9)

访问以下链接。它会帮助你清除疑虑。