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