2015-12-02 50 views
1

我發現對於相當大的數組(超過1000個條目),方法A.removeAll(B)HashSet上比在ArrayList上快得多。ArrayList vs HashSet中的removeAll()

您是否瞭解如何實施這些方法以及如何解釋這種差異?

回答

6

一組(並因此HashSet以及)包含B至多一個元件,並且自HashSet使用散列這是相當有效的定位和移除元件。因此,總體複雜性應該是O(1),用於刪除全部(即一個)B

一個列表可以在任何位置包含任意數量的B,因此全部移除B必須檢查所有元素。總體複雜度爲O(n),因爲如果它是B,則必須檢查每個元素。

編輯:

如果B代表的集合/陣列,即一組多個元素,你就應該由大小Bm乘以上述的複雜性,所以你會得到O(m)HashSetO(n * m)爲名單。

編輯2:

請注意,如果你有一個排序列表的複雜性可能會降低到O(log(n))O(log(n) * m)。對於這個工作代碼刪除實際元素將不得不知道列表雖然排序雖然ArrayList不保證排序它不能進行優化。

+0

所以你的意思是,在複雜的'ArrayList'是約0 (n2)? – Arcyno

+0

@Arcyno你從哪裏得到'O(n2)'(如'O(n * n)')?如果你的意思是'B'是一個集合或數組,請參閱我的編輯。 – Thomas

+0

沒有「ArrayList中的複雜性」這樣的事情。 'ArrayList'的具體操作具有特定的時間複雜性。 ArrayList * *去除*的時間複雜度通常被認爲是O(N)。 –