繁体   English   中英

ArrayList和HashSet中的removeAll()

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM