簡體   English   中英

ArrayList或Linked List-如果要執行插入/刪除和查找操作,則使用哪個集合

[英]ArrayList or Linked List - Which collection to use if both insertion/deletion and look up operation is to be performed

眾所周知,鏈接列表用於快速插入刪除,數組列表用於快速查找

我要求將10000條記錄保存在列表中。 我將使用哪個集合。 查找和插入/刪除操作都可以在該列表上執行。

我使用哪個收藏集,為什么? 還是我會使用自己創建的收藏集?

插入

LinkedList

首先插入-O(1)

最后插入-O(1)

在任何地方插入-O(n)-這是因為需要按索引查找要插入的位置。

ArrayList

首先插入-O(n)

最后插入-O(1)

插入到任何地方-O(n)


因此, LinkedListArrayList在任何位置都具有相同的O(n)插入。

刪除

LinkedList

首先刪除-O(1)

最后刪除-O(1)

刪除任何地方-O(n)-再次是因為需要按索引查找要刪除的位置。

ArrayList

首先刪除-O(n)

最后刪除-O(1)

刪除任何地方-O(n)

因此, LinkedListArrayList在任何位置都具有相同的O(n)刪除。


如您所見,在任何地方插入和刪除都是相同的。 如果您總是插入最后一個操作,則可以使用ArrayList,因為如果您知道索引,則對LinkedList的查找為O(1)和O(n)。 我認為您需要找到最適合使用的黃金中間點。

另外,如果您不關心無復制,則可以使用HashSet。 它基於哈希表,並為插入,刪除和查找提供合適的性能(在許多情況下為O(1),O(log(n)))。

HashSet Jdoc

該類為基本操作(添加,刪除,包含和大小)提供恆定的時間性能,假設哈希函數將元素正確地分散在存儲桶中。

每當您需要選擇適合您問題的數據結構時,請在下面的鏈接中查看這些表。
大復雜性

在不查看數據的情況下,除非您的用例涉及使用ListIterator的大量插入和刪除操作(=兩端都不操作時在LinkedList上獲得O(1)插入和刪除操作的方式),否則實際性能會由於較低的開銷和較少的指針解引用,建議使用ArrayList

在您選擇時很重要的因素:

  1. 您的清單中有什么? 如果您的列表是小對象的集合(例如Integer ),則LinkedList開銷將更加明顯。 LinkedList每個節點至少需要2個額外的指針,每個節點的估計開銷約為8個字節。 更多的內存意味着更多的高速緩存未命中和性能降低。
  2. 您將如何精確地插入和刪除? 如果僅在列表末尾插入和刪除,則使用ArrayListArrayList的方法。 如果您在隨機位置插入和刪除,則ArrayList可能仍然是可行的方法(因為掃描速度更快)。 僅當您需要在開始時插入和/或始終使用ListIterator時,您才真正從LinkedList看到性能優勢。
  3. 您的列表將變得無序,並且需要多長時間執行一次完整掃描? 雖然理論上所有內存訪問都花費相同的時間,但遍歷RAM中彼此相鄰的元素(由於處理器高速緩存)要比遍歷所有元素更快。

最后-您是否考慮過使用SetMap來加快搜索和訪問速度? O(n)列表訪問快速總結,特別是如果您在循環內使用它。 映射和集合可以提供O(log n)O(1)訪問(取決於實現),以顯着提高性能。

一些參考:

暫無
暫無

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

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