У меня есть массив с плавающей точкой, отсортированный от наименьшего к наибольшему, и мне нужно иметь возможность выбрать ближайший с плавающей точкой больше или меньше, чем переданное входное значение. Это входное значение не обязательно присутствует в качестве значения в массиве.
Наивным подходом было бы сделать простой линейный поиск по массиву. Это может выглядеть так:
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 ".
Я делаю эту операцию сотни тысяч раз, но могу выполнить любую предварительную обработку массива с плавающей точкой, если это улучшит время поиска. Я абсолютно могу изменить, чтобы использовать что-то кроме вектора для их хранения, если это поможет.