HashSet.Intersect()的顺序对性能有影响吗?

时间:2012-09-07 13:40:02

标签: .net algorithm collections intersection hashset

我猜它没有,但如果有人可以确认。

如果我尝试交叉两组: A(100万件) B(1项)

框架总是做A.Contains(B)一次,而不是B.Contains(A)一百万次吗?

这假设在引擎盖下的交叉是如何工作的,与我不知道的一些奇特的算法相反。

更新

好的,对于c#,你应该清楚地做B.InsersectWith(A),如果B<< A. Intersect()IEnumerable上定义,根据以下答案(和MSDN)效率会低很多。因此,如果您使用最佳工具IntersectWith()

,订单就很重要

3 个答案:

答案 0 :(得分:3)

来自文档

如果其他参数表示的集合是具有与当前HashSet对象相同的相等比较器的HashSet集合,则此方法是O(n)操作。否则,此方法是O(n + m)操作,其中n是Count,m是其他元素的数量。

HashSet.IntersectWith Method

如果您正在寻找速度实现(覆盖)GetHashCode,如果您可以从数据中派生出有意义的哈希值。并覆盖Equal。我为任何将在集合中的类执行此操作。

Object.GetHashCode Method

答案 1 :(得分:0)

这取决于您是作为一般性问题或特定语言提出的。

在Java中,它将遍历第二个集合,然后遍历第一个集合以查看它是否包含该元素。所以它仍会迭代两组。

在c#中,该方法的作用是枚举第一组(A)的元素,然后枚举第二组(B)的元素并标记那些常见的元素,之后它会产生那些元素。顺序。

所以,为了回答你的问题,我会说它没有。这是必须通过每个容器

答案 2 :(得分:0)

代码编写为一般情况。如果您是这样的特殊情况,则应该实现对您的特定用例有效的自定义逻辑。

Contains()方法只是遍历列表,直到找到匹配为止,所以顺序肯定是重要的,如果这就是它正在做的事情,但我相信另一个答案就其工作原理而言是正确的,因为表示每个项目最多迭代一次,而“Contains”解决方案可以迭代主列表中每个元素的整个“子”列表。

实际解决方案= x + y次迭代 包含solution = x +(x * y)迭代