![](/img/trans.png)
[英]In Java, why is insertion or deletion in a Linked List a constant time operation? Isn't it misleading?
[英]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)
因此, LinkedList
和ArrayList
在任何位置都具有相同的O(n)插入。
刪除
LinkedList
首先刪除-O(1)
最后刪除-O(1)
刪除任何地方-O(n)-再次是因為需要按索引查找要刪除的位置。
ArrayList
首先刪除-O(n)
最后刪除-O(1)
刪除任何地方-O(n)
因此, LinkedList
和ArrayList
在任何位置都具有相同的O(n)刪除。
如您所見,在任何地方插入和刪除都是相同的。 如果您總是插入最后一個操作,則可以使用ArrayList,因為如果您知道索引,則對LinkedList的查找為O(1)和O(n)。 我認為您需要找到最適合使用的黃金中間點。
另外,如果您不關心無復制,則可以使用HashSet。 它基於哈希表,並為插入,刪除和查找提供合適的性能(在許多情況下為O(1),O(log(n)))。
HashSet Jdoc
該類為基本操作(添加,刪除,包含和大小)提供恆定的時間性能,假設哈希函數將元素正確地分散在存儲桶中。
每當您需要選擇適合您問題的數據結構時,請在下面的鏈接中查看這些表。
大復雜性
在不查看數據的情況下,除非您的用例涉及使用ListIterator
的大量插入和刪除操作(=兩端都不操作時在LinkedList
上獲得O(1)
插入和刪除操作的方式),否則實際性能會由於較低的開銷和較少的指針解引用,建議使用ArrayList
。
在您選擇時很重要的因素:
Integer
),則LinkedList
開銷將更加明顯。 LinkedList
每個節點至少需要2個額外的指針,每個節點的估計開銷約為8個字節。 更多的內存意味着更多的高速緩存未命中和性能降低。 ArrayList
是ArrayList
的方法。 如果您在隨機位置插入和刪除,則ArrayList可能仍然是可行的方法(因為掃描速度更快)。 僅當您需要在開始時插入和/或始終使用ListIterator
時,您才真正從LinkedList
看到性能優勢。 最后-您是否考慮過使用Set
或Map
來加快搜索和訪問速度? O(n)列表訪問快速總結,特別是如果您在循環內使用它。 映射和集合可以提供O(log n)
和O(1)
訪問(取決於實現),以顯着提高性能。
一些參考:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.