【问题标题】:Does the order of HashSet.Intersect() matter for performance?HashSet.Intersect() 的顺序对性能有影响吗?
【发布时间】:2012-09-01 09:46:42
【问题描述】:

我猜它不会,但如果有人可以确认的话。

如果我尝试使两个集合相交: A(100 万件) B(1 项)

框架是否总是执行 A.Contains(B) 一次,而不是 B.Contains(A) 一百万次?

这是假设相交在底层是如何工作的,这与我不知道的一些奇特算法相反。

更新:

好的,所以对于 c#,如果 B Intersect() 是在 IEnumerable 上定义的,那么对于 c# 你应该清楚地执行 B.InsersectWith(A),并且根据下面的答案(和 MSDN)效率会低很多。因此,如果您使用最好的工具,即IntersectWith(),那么顺序确实很重要。

【问题讨论】:

  • 更新:好的,所以我忘了提到这是一个 .NET 问题。放松:-)
  • 如果您正在寻找单个项目,为什么要相交?
  • 是的,我问它是哪种语言。 30分钟后没有得到回复,然后删除了我的评论。由于algorithm 标签,你的问题没有多大意义。看看答案。现在可以了。
  • 你说的是Enumerable<T>.Intersect还是HashSet<T>.IntersectWith
  • Blam:单项是展示集合之间不平衡的最极端情况的示例。 @CodesInChaos 我问的是 Intersect,但如果其底层算法不同,则可以轻松使用 IntersectWith。

标签: .net algorithm collections intersection hashset


【解决方案1】:

这取决于您是作为一般问题还是针对特定语言提出问题。

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

在c#中,该方法的作用是枚举第一个集合(A)的元素,然后枚举第二个集合(B)的元素并标记那些共同的元素,然后生成那些元素顺序。

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

【讨论】:

    【解决方案2】:

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

    Contains() 方法只是遍历列表直到找到匹配项,因此如果它正在执行此操作,那么顺序肯定很重要,但我相信另一个答案就其工作方式而言是正确的,因为意味着最多迭代每个项目一次,而“包含”解决方案可以为主列表中的每个元素迭代整个“子”列表。

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

    【讨论】:

    • Contains solution = x+(x*y)。这就是为什么在数据库中这个顺序很关键
    【解决方案3】:

    来自文档

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

    HashSet.IntersectWith Method

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

    Object.GetHashCode Method

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2014-12-05
      • 2015-04-17
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      相关资源
      最近更新 更多