C# - 帮助优化循环

时间:2011-03-07 12:50:54

标签: c# .net

我有一段代码,原则上如下所示。问题是我触发了数千次的代码10次,需要对其进行更优化。任何建议都会受到欢迎。

//This array is in reality enormous and needs to be triggered loads of times in my code
int[] someArray = { 1, 631, 632, 800, 801, 1600, 1601, 2211, 2212, 2601, 2602 };

//I need to know where in the array a certain value is located
//806 is located between entry 801 and 1600 so I want the array ID of 801 to be returned (4).
id = 806

//Since my arrays are very large, this operation takes far too long 
for (int i = 0; i < someArrayLenght; i++)
{
  if (someArray[i] <= id)
    return i;
}

编辑:抱歉条件错了。当806大于801时,它应该返回id。希望你能理解它。

2 个答案:

答案 0 :(得分:10)

数组值看起来已排序。如果确实如此,请使用binary search

int result = Array.BinarySearch(someArray, id);
return result < 0 ? (~result - 1) : result;

如果搜索的值未出现在数组中,Array.BinarySearch将返回下一个更大值索引的按位补码。这就是我在上面的代码中测试负数并使用按位补码运算符的原因。结果应与您的代码中的结果相同。

二进制搜索具有对数运行时间而不是线性。也就是说,在最坏的情况下,只有log 2 n 必须搜索许多条目而不是 n (其中 n >是数组的大小。)

答案 1 :(得分:2)

提供someArray的内容已排序,请使用binary search - 另请参阅Array.BinarySearch

注意:在您的示例中,if (someArray[i] <= id) return i;中的条件将在id >= 1时触发。我怀疑那是你想要做的。