2012-02-18 41 views
2

這是從維基百科:http://en.wikipedia.org/wiki/Arraylist性能。 ArrayList:remove(),add()在數組末尾的時間,add(),remove()在開始的線性時間。java列表處理時間

LinkedList:兩種操作均表示:恆定時間,索引:線性。


1)爲什麼在兩個操作之間arraylist處理時間的區別?

2)Linkedlist對於索引是線性的,對於最後添加常量,爲什麼?

回答

1

當你addArrayList的末尾時,它會自我增長以留出一些空間。所以如果你有一個十個元素ArrayList,在最後添加將導致它在內部爲二十個元素分配空間,複製你已有的十個元素,然後添加一個元素。然後,當你在最後添加另一個元素時,它會將第十二個元素粘貼到它已經創建的空間中。

這在技術上並沒有給它在最後的固定時間插入,但它確實給它分期付款固定時間插入。也就是說,在大量的運營中,成本接近恆定的時間;每次增長時,它都會增加一倍,因此在必須再次進行增長和複製之前,您將擁有數量更多的「免費」常量插入。

當您在開始插入時,它不能這樣做,並且必須始終將整個列表複製到新位置(線性時間)。

因爲您只是將最後一個單元格從「已填充」切換到「可用空間」,所以從最後移除始終是恆定時間。你永遠不需要複製列表。

至於你的第二個問題,一個LinkedList保持一個指針到列表的末尾,所以addremove那裏只是使用該指針,因此是恆定的時間。在列表中間沒有快速指針,因此訪問任意元素需要從開始到(可能)結束的線性時間遍歷。

3

1)因爲要在開始時添加/刪除它必須移動所有內容並重新索引。

2)因爲它保持對頭部和尾部的引用(開始&結束)。索引意味着遍歷列表。

1

i)ArrayList - >在開始時刪除/添加的情況下,您必須將所有元素推到一個位置,因此需要線性時間。在數組的末尾,您只需添加或刪除。 ii)LinkedList - >你有頭部和尾部的引用,因此你可以在那裏添加/刪除任何東西(在不變的時間內)。

1
  1. 因爲在最後刪除不需要移動數據。添加可能需要複製來調整存儲陣列的大小,但是現在是攤銷
  2. 因爲在最後添加並不需要走列表,但索引。