我有一个浮点数据列表,我想在其中找到正好低于传递值的索引。一个简化的例子:
double[] x= {1.0, 1.4, 2.3, 5.6, 7.8};
double[] y= {3.4, 8.2, 5.3, 8.1, 0.5};
int lowerIndex = BinaryIndexSearch(x, 2.0); // should return 1
目的是使用x
和y
使用lowerIndex
和lowerIndex+1
执行插值。
二进制索引搜索算法类似于
int BinaryIndexSearch(double[] x, double value)
{
int upper = x.Length - 1;
int lower = 0;
int pivot;
do
{
pivot = (upper + lower) / 2;
if (value >= x[pivot])
{
lower = pivot + 1;
}
else
{
upper = pivot - 1;
}
}
while (value < x[pivot] || value >= x[pivot + 1]);
return pivot;
}
使用LINQ有更有效的方法吗?它通常会更快吗? do..while循环结束时的比较操作是我程序中“最热门”的代码行。
答案 0 :(得分:9)
LINQ不会比二进制搜索更有效。
但是,您正在重新发明现有的Array.BinarySearch
method。
如果找不到该元素,Array.BinarySearch
将返回它应该位置的按位补码(~
运算符)。
答案 1 :(得分:5)
Linq是通过IEnumerable编写的。它不是为了表现。作为一般经验法则,所有对所使用的数据结构有深入了解的算法将比通用解决方案(如LINQ)更快。