我發現對於相當大的數組(超過1000個條目),方法A.removeAll(B)
在HashSet
上比在ArrayList
上快得多。ArrayList vs HashSet中的removeAll()
您是否瞭解如何實施這些方法以及如何解釋這種差異?
我發現對於相當大的數組(超過1000個條目),方法A.removeAll(B)
在HashSet
上比在ArrayList
上快得多。ArrayList vs HashSet中的removeAll()
您是否瞭解如何實施這些方法以及如何解釋這種差異?
一組(並因此HashSet
以及)包含B
至多一個元件,並且自HashSet
使用散列這是相當有效的定位和移除元件。因此,總體複雜性應該是O(1)
,用於刪除全部(即一個)B
。
一個列表可以在任何位置包含任意數量的B
,因此全部移除B
必須檢查所有元素。總體複雜度爲O(n)
,因爲如果它是B
,則必須檢查每個元素。
編輯:
如果B
代表的集合/陣列,即一組多個元素,你就應該由大小B
m
乘以上述的複雜性,所以你會得到O(m)
爲HashSet
和O(n * m)
爲名單。
編輯2:
請注意,如果你有一個排序列表的複雜性可能會降低到O(log(n))
或O(log(n) * m)
。對於這個工作代碼刪除實際元素將不得不知道列表雖然排序雖然ArrayList
不保證排序它不能進行優化。
基本上兩者的原因是這些特定實現嘗試爲它們的專有操作實現時間複雜性。
爲ArrayList
remove方法的時間複雜度爲O(n - index)
source from When to use LinkedList over ArrayList?
雖然HashSet
的remove方法提供了恆定的時間複雜度O(1)
source from Hashset vs Treeset
所以你的意思是,在複雜的'ArrayList'是約0 (n2)? – Arcyno
@Arcyno你從哪裏得到'O(n2)'(如'O(n * n)')?如果你的意思是'B'是一個集合或數組,請參閱我的編輯。 – Thomas
沒有「ArrayList中的複雜性」這樣的事情。 'ArrayList'的具體操作具有特定的時間複雜性。 ArrayList * *去除*的時間複雜度通常被認爲是O(N)。 –