簡體   English   中英

Java中的時間復雜性

[英]Time complexity in Java

對於方法,添加ArrayList Java API狀態:

添加操作以分攤的常量時間運行,即添加n個元素需要O(n)時間。

我想知道當使用LinkedList的add方法時,它是否是同一時間復雜度,線性。

這取決於您要添加的位置。 例如,如果在ArrayList中添加到列表的前面,則實現將不得不每次都移動所有項目,因此添加n個元素將以二次方式運行。

類似於鏈表,JDK中的實現保持指向頭部和尾部的指針。 如果你繼續附加在尾部,或者在頭部前面,則操作將在n個元素的線性時間內運行。 如果您追加到其他位置,則實現必須在鏈接列表中搜索正確的位置,這可能會使運行時更糟糕。 同樣,這取決於插入位置; 如果你插入列表的中間,你會得到最差的時間復雜度,因為必須遍歷最大數量的元素來找到插入點。

實際的復雜程度取決於您的插入位置是否恆定(例如,始終位於第10個位置),或者是列表中項目數量的函數(或者對其進行任意搜索)。 第一個會給你O(n)一個稍差的常數因子,后者O(n ^ 2)。

在大多數情況下, ArrayListadd()方法上優於LinkedList ,因為它只是保存指向數組的指針並遞增計數器。

但是,如果woking數組不夠大,則ArrayListArrayList工作數組,分配一個新數組並復制內容。 這比向LinkedList添加新元素要慢 - 但如果你經常添加元素,那么只會發生O(log(N))次。

當我們談論“攤銷”的復雜性時,我們會計算一些參考任務的平均時間。

所以,回答你的問題,它的復雜性不同:它在大多數情況下要快得多(盡管仍然是O(1)),有時候要慢得多(O(N))。 使用分析器可以更好地檢查對您有什么好處。

如果你的意思是add(E)方法(不是add(int, E)方法),答案是肯定的,將單個元素添加到LinkedList的時間復雜度是恆定的(添加n個元素需要O(n)時間)

正如Martin Probst指出的那樣 ,不同的位置會產生不同的復雜性,但是add(E)操作總會將元素附加到尾部,從而導致一個恆定的(攤銷的)時間操作

暫無
暫無

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

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