[英]removeAll() in ArrayList vs HashSet
我發現對於相當大的A.removeAll(B)
(超過1000個條目), HashSet
上的A.removeAll(B)
方法比ArrayList
上的方法要快得多。
您是否知道如何實施這些方法以及如何解釋這種差異?
一個集合(因此也包括HashSet
)最多包含B
一個元素,並且由於HashSet
使用散列,因此定位和刪除該元素非常有效。 因此,去除所有(即一個) B
的總復雜度應為O(1)
。
列表可以在任何位置包含任意數量的B
,因此刪除所有B
必須檢查所有元素。 總體復雜度為O(n)
因為必須檢查每個元素是否為B
編輯:
如果B
表示一個集合/數組,即一組多個元素,則將上述復雜度乘以B
的大小m
,以便對HashSet
獲得O(m)
,對於列表獲得O(n * m)
。
編輯2:
請注意,如果您有一個排序列表,則復雜度可能會降低為O(log(n))
或O(log(n) * m)
。 為此,刪除實際元素的代碼必須知道列表已排序,並且由於不能保證對ArrayList
進行排序,因此無法進行優化。
基本上,這兩者的原因都是這些具體實現試圖實現其尊敬的操作所花費的時間復雜性。
ArrayList
移除方法的時間復雜度是O(n - index)
源於何時在ArrayList上使用LinkedList?
盡管HashSet
的remove方法從Hashset vs Treeset提供了恆定的時間復雜度O(1)
源
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.