【发布时间】:2016-03-06 21:26:55
【问题描述】:
我发现对于相当大的数组(超过 1000 个条目),A.removeAll(B) 方法在 HashSet 上比在 ArrayList 上快得多。
您知道这些方法是如何实现的,以及如何解释这种差异吗?
【问题讨论】:
标签: java arraylist hashset removeall
我发现对于相当大的数组(超过 1000 个条目),A.removeAll(B) 方法在 HashSet 上比在 ArrayList 上快得多。
您知道这些方法是如何实现的,以及如何解释这种差异吗?
【问题讨论】:
标签: java arraylist hashset removeall
一个集合(因此也包括HashSet)最多包含B 的一个元素,并且由于HashSet 使用散列,因此定位和删除该元素非常有效。因此,整体复杂性应该是O(1),用于删除所有(即一个)B。
一个列表可以在任何位置包含任意数量的B,因此删除所有B 必须检查所有元素。总体复杂度为O(n),因为必须检查每个元素是否为B。
编辑:
如果B 表示一个集合/数组,即一组多个元素,您将上述复杂性乘以B 的大小m,因此您将得到O(m) for HashSet O(n * m) 用于列表。
编辑 2:
请注意,如果您有一个排序列表,则复杂性可能会降低到O(log(n)) 或O(log(n) * m)。为此,删除实际元素的代码必须知道列表已排序,但由于不能保证 ArrayList 已排序,因此无法进行优化。
【讨论】:
ArrayList 的复杂度大约是 O(n2) ?
O(n2)(如O(n * n))?如果您的意思是 B 是一个集合或数组,请查看我的编辑。
ArrayList 中的复杂性”这样的东西。 ArrayLists 上的特定操作具有特定的时间复杂度。 ArrayListremoval的时间复杂度一般认为是O(N)。
基本上两者的原因是这些特定实现试图为各自的操作实现的时间复杂度。
ArrayList remove 方法的时间复杂度是O(n - index) source from When to use LinkedList over ArrayList?
虽然 HashSet 的 remove 方法提供恒定的时间复杂度 O(1) source from Hashset vs Treeset
【讨论】: