Java 设置时间和速度复杂性

Java 设置时间和速度复杂性,java,algorithm,collections,Java,Algorithm,Collections,我正在复习算法和数据结构,我有一些问题和陈述,希望你们检查一下 ArrayList-O(1)(大小、获取、设置等),O(n)-添加操作。 LinkedList-所有操作O(1)(包括add()),但检索第n个元素O(n)除外。我假设size()操作也在O(1)中运行,对吗 树集-所有操作O(lg(N))。size()运算需要O(lg(n)),对吗 哈希集-如果应用了正确的哈希函数,则所有操作都是O(1)。 HashMap-所有操作O(1),与HashSet无关 欢迎进一步解释。提前感谢。Arra

我正在复习算法和数据结构,我有一些问题和陈述,希望你们检查一下

ArrayList-O(1)(大小、获取、设置等),O(n)-添加操作。
LinkedList-所有操作O(1)(包括add()),但检索第n个元素O(n)除外。我假设size()操作也在O(1)中运行,对吗

树集-所有操作O(lg(N))。size()运算需要O(lg(n)),对吗

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

欢迎进一步解释。提前感谢。

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

从:

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

就性能分析而言,文档对于Java集合来说通常是相当不错的

散列算法的O(1)不仅仅是应用一个“适当的”散列函数——即使有一个非常好的散列函数,也可能会发生散列冲突。通常的复杂度是O(1),但是如果所有的散列发生冲突,它当然可以是O(n)


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

请访问以下链接。这将帮助你消除疑虑


如果你有这样神奇的HashSet,为什么需要ArrayList?@Stas:因为列表和集合不是一回事,而且常量因子可能仍然有很大的不同…@Stas:顺序只让你知道操作的伸缩方式。它不会告诉你因子,例如HashSet可能比ArrayList慢很多倍,并且没有get()/set()方法。@Peter Lawrey,@Jon Skeet你是对的。这就是为什么我认为这种同情心是误导性的。@Stas:只有当你不理解大O符号时,它们才是误导性的。我看不到任何人被误导或迷惑的证据。+1:同样,LinkedList是O(1),前提是它不会触发GC,而它更可能触发GC。;)@Suraj:GC=“garbage collection”(?)@Suraj,LinkedList.add()总是创建一个对象,并且它比ArrayList消耗更多内存。因此,虽然在纸面上ArrayList会有LinkedList没有的延迟,但它更不可能触发所有延迟中最长的延迟。@peter,我不会说它自己会导致GC,除非你真的在你的jvm中创建DB,但是你得到了一个点,而不是关于
HashSet
HashMap.add
:它们的复杂性也受到散列函数的影响(可能是O(k),其中k是字符串长度)。