设置时间和速度复杂性

2022-09-02 03:31:52

我正在复习算法和数据结构,并有一些问题以及我希望您检查的陈述。

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

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

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

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


答案 1

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

来自 Javadoc

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

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

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

(此外,这是将哈希的成本计为O(1) - 实际上,如果您要对字符串进行哈希处理,则每个调用在字符串的长度上可能是O(k)。hashCode


答案 2

请访问以下链接。它将帮助您消除疑虑。