我发现对于相当大的数组(超过1000个条目),方法A.removeAll(B)
在HashSet
上比在ArrayList
上更快。
您是否知道如何实施这些方法以及如何解释这些差异?
答案 0 :(得分:7)
一个集合(因而protected void handleFire() {
try {
Desktop.getDesktop().open(getFile());
} catch (IOException | IllegalArgumentException | NullPointerException e) {
logger.log(Level.SEVERE, String.format("Could not open file. %s", e.getMessage()));
}
}
)最多包含HashSet
的一个元素,并且由于B
使用散列,因此定位和删除该元素非常有效。因此,总体复杂度应为HashSet
,以便删除所有(即一个)O(1)
。
列表可以在任何位置包含任意数量的B
,因此删除所有B
必须检查所有元素。总体复杂度为B
,因为如果它是O(n)
,则必须检查每个元素。
编辑:
如果B
代表一个集合/数组,即一组多个元素,您可以将上述复杂度乘以B
的{{1}}大小,这样您就可以{ {1}} m
和B
列表。
编辑2:
请注意,如果您有排序列表,则复杂性可能会降低到O(m)
或HashSet
。为了实现这一点,删除实际元素的代码必须知道列表已排序,因为O(n * m)
不能保证排序,所以无法进行优化。
答案 1 :(得分:1)
基本上两者的原因是这些特定实现试图为其相应的操作实现的时间复杂性。
ArrayList
删除方法的时间复杂度为O(n - index)
source from When to use LinkedList over ArrayList?
虽然HashSet
的移除方法提供了恒定的时间复杂度O(1)
source from Hashset vs Treeset