[英]Help choosing the right data structure
我需要一個具有以下要求的數據結構:
我傾向於使用ArrayList
。 在這種情況下,似乎是O(1)
都讀取元素(它們總是?),刪除元素(我只需要在列表的末尾刪除它們)並添加(我只添加到結尾名單)。
只有一個問題是,當ArrayList完全填滿並且我需要向它添加更多元素時,ArrayList會不時地產生性能損失。
還有其他更好的主意嗎? 我不認為這里的數據結構超過了ArrayList
。
謝謝
聽起來不錯,但在C#中你應該使用List<T>
。 它是ArrayList<E>
的Java等價物。 C#中的ArrayList
類不是通用的,並且基本上被新的List<T>
類廢棄了。
只有一個問題是,當ArrayList完全填滿並且我需要添加更多元素時,它會不時地產生性能損失。
這可能不會是一個問題,你可能不應該擔心它,除非你的性能分析。 但是,如果您事先知道(或可以猜測)列表將包含的元素數量,則可以將其Capacity
設置為該值(使用Java中的ensureCapacity
)。 這將使列表提前保留所需的內存。 您還可以使用兩種 語言為列表構造函數提供容量。
使用ArrayList。
當你正確地說它達到容量限制時,它會動態調整大小。 然而,這應該不是問題,因為它使用足夠聰明的算法,即每個附加操作的平均成本仍然只是O(1)。
始終使用List<T>
而不是ArrayList
實際上添加可能更多是O(N),因為當數組超過分配限制時必須重新分配和復制數組。 Javadocs指定它以O(N)的攤銷成本增長,無論這意味着什么,正如我所期望的那樣O(NlogN),但顯然他們擁有比我所知的更智能的算法。
如果在施工時分配足夠的元素來包含完整的集合,則為O(1)。
請參閱: http : //java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html
您需要平衡讀取訪問的相對頻率與對List<T>
寫入訪問權限。 必須注意的是,對於大多數用途,您不太可能注意到調整ArrayList<T>
的大小
但是,如果你在最后添加和刪除一個項目,那么你所說的比通過索引獲取項目更多(基本上使用List作為堆棧或隊列 ),你的探查器會告訴你ArrayList<T>
是你的位置性能瓶頸是,你應該考慮使用LinkedList<T>
,它只是用於這種用法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.