【发布时间】:2017-12-26 12:23:59
【问题描述】:
为什么 ArrayList add() 和 add(int index, E) 复杂度是摊销常数时间?
为什么不是 O(1) 用于单个 add() 操作,O(n) 用于单个 add(int index, E) 操作和 O(n) 用于使用 (any) add 添加 n 个元素(n 个添加操作)方法?假设我们很少使用 add(int index, E) 添加到数组末尾?
数组(和ArrayList)不是已经有n个元素的一种操作复杂度:
- add() - O(1)?
- add(int index, E) - O(n)?
如果我们进行一百万次插入,1 和 2 的平均值不可能是 O(1),对吧?
为什么甲骨文说
加法运算以摊销常数时间运行,即加n 元素需要 O(n) 时间。
我认为 add() 的复杂度为 O(1),add(int index, E) 的复杂度为 O(n)。
这是否意味着“n个操作的积分复杂度”(每个操作的复杂度为O(1))可以说是n * O(1)= O(n)。我错过了什么?
也许对于 Oracle 来说“添加操作”总是只意味着 add()?而 add(int, E) 是“插入操作”?然后就彻底明白了!
我有一个猜测,它与渐近分析和摊销分析之间的差异有关,但我无法掌握到最后。
What is amortized analysis of algorithms?
Why the time complexity of an array insertion is O(n) and not O(n+1)?
More appropriate to say Amortized O(1) vs O(n) for insertion into unsorted dynamic array?(不太清楚)
【问题讨论】:
-
Isn't inserting with add(int index, E) 99% 的时间不在数组末尾,这意味着它还会触发至少一些最右边元素的移动,并且对于足够大的数组(已经有插入了许多元素)这样的移动总是O(n)?不管容量/调整大小问题?意思是 add(int index, E) (几乎)总是 O(n)?那么为什么要摊销 O(1)?
-
谁说
add(int, E)不是 O(n)? -
但是 Oracle 在 ArraList 文档中的意思是:“添加操作在摊销的常数时间内运行”???他们的意思是只有 add()?让我们猜猜它们是什么意思?可能他们将 add(int, E) 称为“插入”,而不是添加...
-
是的,那只是指
add(E)。 -
源代码告诉你你需要知道的一切
标签: java arrays arraylist time-complexity