我正在刷新算法和数据结构,并且有一些问题以及我希望你检查的陈述。
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无关。
非常欢迎任何进一步的解释。提前谢谢。
答案 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)