【问题标题】:Fastest way to find an item in a list?在列表中查找项目的最快方法?
【发布时间】:2011-01-05 17:55:16
【问题描述】:

我有一个未排序的字符串列表。我可以将这些项目放在一个数组中,List、SortedList 等等。

我需要找到在此列表中查找字符串的最快方法。我最好将列表转储到数组中,对其进行排序,然后实现二进制搜索?或者框架是否提供了一种方法来做到这一点?

谢谢

附:针对 .NET 2.0 使用 VS2008

【问题讨论】:

    标签: c# visual-studio-2008 search .net-2.0 lookup


    【解决方案1】:

    如果您的目标只是快速找到集合中的字符串,请将它们放入HashSet

    HashSet.Contains 是一个 O(1) 的方法,并且字符串默认具有良好的哈希算法,因此很难做出比这更快的例程。


    编辑:

    由于您使用的是 .NET 2,所以我只需执行 Dictionary<string,string> 并使用相同的字符串作为键和值。 Dictinoary<TKey,TValue>.Contains 也是 O(1),并且比您尝试的任何基于列表的搜索要快得多。

    【讨论】:

    • 我很抱歉 - 我更新了标签。我正在使用带有 .NET 2.0 的 VS2008 - HashSet 不可用。
    • .Net 真的没有 HashSet 等价物吗?
    • .NET 现在有一个 HashSet。 2.0 中没有。
    • +1 令人着迷。当我读到这个问题时,我将“查找”解释为不仅仅是确定集合中是否“存在”给定字符串 :) 不再使用 .NET 2.0,但绝不会考虑在你建议的方式。谢谢,
    【解决方案2】:

    如果您一次只需要找到一个对象,请从头开始,逐个查看,直到找到为止。如果您必须对同一个列表多次重复此 Find 操作,以找到不同的项目,然后对其进行排序,保留排序后的列表并进行二分搜索...

    【讨论】:

      【解决方案3】:

      我不确定这是否对您有用,但这将是一种相当简单的方法,但不确定它的确切“速度”。

      List<string> collection = new List<string>();
      
      collection.Sort();
      
      foreach(string value in collection)
      {
         if(value == "stringToLookFor")
         {
             return value;
         }
      {
      

      【讨论】:

      • 如果你还是要遍历它,为什么要排序呢?
      • 这可能是搜索列表最慢的方法。如果你对它进行排序,你可以做一个 BinarySearch,它比在基于键/值的集合中的搜索要快得多,但仍然慢。
      • 我只是假设排序搜索比查看随机放置的字符串更快,特别是如果它位于列表的开头。这只是一个建议,绝不是唯一的解决方案。
      猜你喜欢
      • 2016-06-09
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 2017-12-18
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多