2010-02-16 585 views
3

在我的程序中,我有一堆增長數組,其中一個新元素逐個增長到數組的末尾。我確定列表是我程序關鍵部分的速度瓶頸,因爲它們與陣列相比訪問時間較慢 - 切換到陣列可將性能極大地提高到可接受的水平。所以爲了增長數組我使用Array.Resize。這很有效,因爲我的實現將數組大小限制爲大約20個元素,所以Array.Resize的O(N)性能是有界的。C#在末尾增加一個元素的數組

但是,如果有一種方法可以在末尾增加一個元素而不必使用Array.Resize,我相信它會將舊數組的副本複製到新大小的數組中。

所以我的問題是,是否有一個更有效的方法來添加一個元素到數組的末尾而不使用List或Array.Resize?

回答

10

A List與數組一樣具有恆定的時間訪問權限。對於'增長陣列',你應該使用List

當您知道您可能將元素添加到陣列支持的結構中時,您不需要一次添加一個新的大小。通常情況下,最好在數組填滿時通過加倍數組來擴大數組。

+3

如果你需要在處理.ToArray()的_end_數組,當然。 – 2010-02-16 10:27:15

1

列表分配4個元素(除非您在構造它時指定一個容量),然後每增加4個元素。

你爲什麼不嘗試類似的事情與陣列?即將它創建爲具有4個元素,然後當您插入第五個元素時,首先將該數組增長4個元素。

0

生長一個數組AFAIK意味着一個新的數組被分配,現有的內容被複制到新的實例。我懷疑這應該比使用List ...更快?

+0

列表似乎比讀取時的數組要慢。在我的代碼的關鍵部分,我讀取數組很多,所以它有很大的不同。 – 2010-02-16 10:33:58

0

以塊爲單位調整數組的速度要快得多(例如10),並將其存儲爲單獨的變量(例如容量),然後在容量達到時才調整數組大小。這是一個列表如何工作,但如果你喜歡使用數組,那麼你應該考慮調整它們的大塊特別是如果你有大量的Array.Resize調用

3

如前所述,List<T>是你是什麼尋找。如果你知道該列表的初始大小,你可以提供一個初始容量爲constructor,這將增加你的表現爲你的初始分配:

List<int> values = new List<int>(5); 

values.Add(1); 
values.Add(2); 
values.Add(3); 
values.Add(4); 
values.Add(5); 
2

沒有辦法調整數組大小,所以唯一的辦法獲得更大的數組是使用Array.Resize來創建一個新的數組。

爲什麼不直接創建數組以便從開始(或最多需要的任何容量)開始創建20個元素,並使用變量來跟蹤數組中使用了多少元素?這樣你就不必調整任何數組的大小。

0

我認爲每個想要使用數組的方法都不會被優化,因爲數組是靜態結構,所以我認爲使用List或其他動態結構會更好。

相關問題