爲什麼ArrayList add()和add(int index,E)複雜度是攤銷常量時間? (1)對於單個add()操作,O(n)對於單個add(int index,E)操作和O(n)用於添加n個元素(n個添加操作)添加方法?假設我們使用add(int index,E)很少添加到數組結尾?爲什麼ArrayList add()和add(int index,E)的複雜度是攤銷常量時間?爲什麼不是O(1)爲add(),O(n)爲add(int index,E)?
是不是陣列(和ArrayList)已經具有n個元素的一個操作的複雜性:
- 加() - O(1)?
- add(int index,E) - O(n)?
如果我們做一百萬插入,1和2的平均值不能是O(1),對不對?
爲什麼Oracle說
增加操作運行在分期常量時間,即,加入正 元件需要O(n)的時間。
我認爲對於add()和O(n)來說add(int index,E)的複雜度是O(1)。
這是否意味着「n操作的整體複雜度」(複雜度O(1)的每個操作)可以說是n * O(1)= O(n)。我錯過了什麼?
也許對於Oracle「添加操作」總是意味着只添加()?並添加(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?(不是很清楚)
Big O when adding together different routines
未插入add(int index,E)99%的時間不在數組末尾,這意味着它還觸發移動至少一些最右邊的元素,並且對於足夠大的數組(已經插入了許多元素),例如移動總是O(n)?無論容量/調整大小的問題?含義add(int index,E)(幾乎)總是O(n)?那麼爲什麼攤銷O(1)? –
誰說'add(int,E)'不是O(n)? –
但Oracle在ArraList文檔中的含義是:「添加操作以分期固定時間運行」?他們的意思只是添加()?讓我們猜猜他們是什麼意思?可能他們把add(int,E)稱爲「insert」,而不是add ... –