【问题标题】:What is the fastest search method for array? [closed]数组最快的搜索方法是什么? [关闭]
【发布时间】:2013-06-16 13:18:33
【问题描述】:

我有长度为 1000^2 的数组类。

数组包含 10-1000 之间的数字。

获取200-300之间数组中所有数字的最快方法是什么?

【问题讨论】:

  • Enumerable.Range(200, 100).ToArray()
  • 你有什么尝试吗?
  • 排序会有所帮助。
  • 一个简单的 for/foreach 循环。此外,如果您尝试构建直方图,那么您可以将所有范围 [200-300[ [300-400[ ] 一起计算,这样您只需扫描一次数组...
  • @SLaks:你知道 O(n)(非并行)排序吗? ;)

标签: c# .net


【解决方案1】:

获取200-300之间数组中所有数字的最快方法是什么?

最快的可能是 O(n)。

遍历数组中的所有元素,如果当前元素在所需范围内,则将其添加到结果列表中。

List<int> result = new List<int>();
for (var i = 0; i < yourOriginalArray.Length; i++)
{
    if (yourOriginalArray[i] >= 200 && yourOriginalArray[i] <= 300)
    {
        result.Add(yourOriginalArray[i]);
    }
}

您也可以使用 LINQ:

List<int> result = yourOriginalArray.Where(x => x >= 200 && x <= 300).ToList();

【讨论】:

    【解决方案2】:

    你可以使用Enumerable.Where这样的方法;

    var array = array.Where(n => n <= 300 && n >= 200).ToList(); 
    

    【讨论】:

    • 如果您使用 LINQ,请避免过早调用 ToList(),以便您也可以从 延迟评估 中受益。 :)
    【解决方案3】:

    我认为,如果您要使用该大小的数组,最好先对其进行排序,然后使用 binary_search 算法,您可以获得数组中前 200 个发生的索引和最后 300 个发生的索引,然后返回元素之间。 这将是检索元素的最快方式。

    【讨论】:

    • 最快的方法是什么?你可以在线性 O(N) 时间内解决它,但排序是 O(N(Log(N))
    • 视情况而定,如果您有足够的时间进行预计算(排序),那么这样做是合乎逻辑的,如果检索到的数字相当大,那么总体而言,这将是最快的方法。
    【解决方案4】:
        Array arr = Array.CreateInstance(typeof(int), 1000000);
        Stopwatch time = new Stopwatch();            
    
        Random random = new Random();
        for (int i = 0; i < arr.Length; i++) 
        {
            arr.SetValue(random.Next(10, 1000), i);
        }
    
        List<int> loopFor = new List<int>();
        time.Start();
        for (int i = 0; i < arr.Length; i++) 
        {
            int value = (int)arr.GetValue(i);
            if (value >= 200 && value <= 300) 
            {
                loopFor.Add(value);
            }
        }
        time.Stop();
        Console.WriteLine("Loop for: {0}", time.Elapsed);
    
        time.Reset();
        time.Start();
        List<int> loopForeach = new List<int>();
        foreach (int i in arr)
        {
            if (i >= 200 && i <= 300)
            {
                loopForeach.Add(i);
            }
        }
        time.Stop();
        Console.WriteLine("Loop foreach: {0}", time.Elapsed);
    
        time.Reset();
        time.Start();
        int[] matchedItems = Array.FindAll((int[])arr, x => x >= 200 && x <= 300);
        time.Stop();
        Console.WriteLine("Array.FindAll: {0}", time.Elapsed);
        Console.Read();
    
    结果:
    LoopF​​or:1102804 毫秒
    循环 foreach:1086569 毫秒
    Array.FindAll:14 毫秒(更好)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-07
      • 1970-01-01
      • 2010-12-23
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      相关资源
      最近更新 更多