HashSet.equals()是否在恒定时间内运行?

时间:2011-04-05 12:59:48

标签: java collections big-o hashset time-complexity

只是想知道HashSet.equals(anotherHashSet)是否在恒定时间内运行(也以ConcurrentHashSet作为参数),我认为这样做是出于效率原因。看不到任何提到它的东西,我正在构建的框架的一部分依赖于功能(不希望它花费太长时间!)。

编辑:抱歉,意识到HashSet.equals()无法在恒定时间内运行,因为元素可以更改,而地图中元素的哈希码保持不变。因此,解决此问题的最佳方法是使用哈希码。虽然代码味道不好吗?

4 个答案:

答案 0 :(得分:7)

查看典型的implementation表明它containsAll。对包含的每个检查都将是O(1),并且必须进行N个,所以我认为O(N)。

答案 1 :(得分:4)

据我从代码中看到 - 它以线性时间运行。迭代该集合并比较每个元素:

equals(..中的AbstractSet调用containsAll(..)中的AbstractCollection,它获取迭代器并为每个元素调用contains(..),然后调用map.containsKey(..) 1}}这是O(1)。所以O(n)如果我没有弄错的话。

答案 2 :(得分:4)

由于equals() contract of a Set要求两个Set对象的元素必须相同,我不认为在一般情况下可以在O(1)中正确实现它(即例如,没有对内容类型的额外限制。

一个明显的例外是,如果incomming集具有不同的大小,那么equals()操作可以很容易地在O(1)中完成(只要size()本身是O(1))。

您可以编写一个瘦包装器,在每次计算时缓存hashCode()(并在Set更改时丢弃它)。这将允许您在大多数情况下具有恒定的运行时间,其中两个Set对象相同。当你必须等于Set个对象时(或者在哈希冲突的情况下),你仍然会有一个O(n)运行时。

答案 3 :(得分:2)

怎么可能在恒定的时间内运行?唯一明智的实现(也就是使用的那个,你可以看到,如果你检查API文档)是迭代其中一个集合,并为每个元素检查另一个元素是否包含它,这基本上是一个O(n + m)操作。