【问题标题】:What is the most performant way to check for existence with a collection of integers?使用整数集合检查是否存在的最有效方法是什么?
【发布时间】:2009-08-21 20:26:54
【问题描述】:

我有一大串整数发送到我的网络服务。我们的业务规则规定这些值必须是唯一的。找出是否有任何重复项的最有效方法是什么?我不需要知道这些值,我只需要知道其中两个值是否相等。

起初我在考虑使用整数的通用列表和 list.Exists() 方法,但这是 O(n);

然后我在考虑使用 Dictionary 和 ContainsKey 方法。但是,我只需要键,不需要值。我认为这也是一种线性搜索。

是否有更好的数据类型可用于在列表中查找唯一性?还是我被线性搜索困住了?

【问题讨论】:

    标签: c# .net generics types unique


    【解决方案1】:

    使用HashSet<T>

    HashSet 类提供高 性能集操作。一个集合是一个 不包含重复的集合 元素,其元素不在 特定顺序

    HashSet<T> 甚至暴露了a constructor that accepts an IEnumerable<T>。通过将您的 List<T> 传递给 HashSet<T>'s 构造函数,您最终将获得对新 HashSet<T> 的引用,该引用将包含与原始 List<T> 不同的项目序列。

    【讨论】:

    • 当 inputList.Count != hashSet.Count, "休斯顿,我们有重复!"
    • 这仍然是 O(n),我认为他能得到的最好的。
    • @Andrew:他可以将项目一项一项添加到 HashSet 中,并在 hashSet.ContainsKey(item) == true 时立即返回异常。如果有重复,将一直保存。
    • @sixlettervariables - 非常正确,那时他将不再需要HashSet<T>,因为IList<T> 的任何实现都具有Contains 方法。
    【解决方案2】:

    听起来像是Hashset 的工作...

    【讨论】:

      【解决方案3】:

      如果您使用的是框架 3.5,则可以使用 HashSet 集合。

      否则最好的选择是Dictionary。每个项目的价值都会被浪费掉,但这会给你最好的表现。

      如果您在将项目添加到 HashSet/Dictionary 时检查重复项,而不是事后对其进行计数,则在存在重复项的情况下,您将获得比 O(n) 更好的性能,因为您不必在找到后继续查找第一个副本。

      【讨论】:

        【解决方案4】:

        如果数字集是稀疏的,那么就像其他人建议的那样使用 HashSet。

        但是,如果数字集大部分是按顺序排列的,偶尔会有间隙,那么将数字集存储为排序数组或 begin,end 对的二叉树会好得多。然后,您可以搜索找到具有小于搜索键的最大开始值的对,并与该对的结束值进行比较以查看它是否存在于集合中。

        【讨论】:

          【解决方案5】:

          怎么办:

          list.Distinct().Count() != list.Count() 
          

          我想知道这个的性能。我认为它会和 O(n) 一样好,但代码更少并且仍然易于阅读。

          【讨论】:

            猜你喜欢
            • 2020-03-23
            • 1970-01-01
            • 2019-09-16
            • 2011-10-28
            • 1970-01-01
            • 1970-01-01
            • 2013-07-04
            • 1970-01-01
            • 2012-06-17
            相关资源
            最近更新 更多