我有一段代码,原则上如下所示。问题是我触发了数千次的代码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。希望你能理解它。
答案 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
时触发。我怀疑那是你想要做的。