-1

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

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

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

4

4 回答 4

7

获得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();
于 2013-06-16T13:21:28.680 回答
3

您可以使用Enumerable.Where类似的方法;

var array = array.Where(n => n <= 300 && n >= 200).ToList(); 
于 2013-06-16T13:24:21.183 回答
1
    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 毫秒(更好)
于 2013-06-16T15:09:27.980 回答
1

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

于 2013-06-16T13:48:42.363 回答