簡體   English   中英

List.Add的漸近復雜性是什么?

[英]What is asymptotic complexity of List.Add?

我發現關於List.Add()漸近復雜性存在很多爭議。 我懷疑它的來源是最糟糕的情況,導致底層數組調整大小 ,邏輯上是O(n)操作。 但是,每次列表空間不足時, 陣列的大小會增加兩倍 這使得n元素所需的調整大小量與log(n)成比例。

這是不是意味着在平均情況下Add操作的漸近復雜度將是O(n/log(n))

List.Add()的真正基准如下。 然而,基准測試並不能真正表達這種操作 - 在任何偏離直線(對數刻度)線變得可見之前,我們可能會耗盡內存。

基准

這意味着List.Add()攤銷復雜性可以通過對調整大小操作求和,然后乘以對列表進行的總添加次數來計算。

T(n) = (2 + 4 + 8 + ... + n/2 + n) / n

但請注意,求和是一個幾何級數 ,我們可以做得比假設(求和) n*log(n)更好:

T(n) < 2n/n = 2 -> T(n) is in O(1)

注意:這里我假設你的意思是add()作為追加。 在任意位置插入元素需要花費O(n)時間,您也必須考慮到這一點,這會將最終結果從O(1)攤銷復雜性更改為O(n)攤銷復雜性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM