我有一个浮点数组,从最小到最大排序,并且需要能够选取大于或小于传递的输入值的最近浮点。此输入值不一定要作为数组中的值存在。
天真的方法是对数组进行简单的线性搜索。可能看起来像这样:
void FindClosestFloatsInArray( float input, std::vector<float> array,
float *min_out, float *max_out )
{
assert( input >= array[0] && input < array[ array.size()-1 ] );
for( int i = 1; i < array.size(); i++ )
{
if ( array[i] >= input )
{
*min = array[i-1];
*max = array[i];
}
}
}
但是很显然,随着数组变大,这将变得越来越慢。
是否有人对算法有一个想法,可以让我更好地找到这些数据?我已经切换到二进制搜索,它在某种程度上已改善了问题,但是它仍然比我想要的慢很多,并且由于我实际上并不是在寻找数组中存在的特定值,因此它永远不会终止早。
详细信息:数组中的浮点值不一定均匀分布(也就是说,数组可以包含值“ 1.f,2.f,3.f,4.f,100.f,1200.f ,1203.f,1400.f“。
我执行了数十万次此操作,但是如果可以改善查找时间,则可以对浮点数组进行任何数量的预处理。如果可以的话,我绝对可以更改为使用矢量以外的其他方式来存储它们。