[英]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.