Eu tenho uma matriz de flutuadores, classificados do menor para o maior, e preciso poder escolher o flutuador mais próximo maior ou menor que um valor de entrada passado. Este valor de entrada não está necessariamente presente como um valor na matriz.
Uma abordagem ingênua seria fazer uma pesquisa linear simples através da matriz. Isso pode ser assim:
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];
}
}
}
Mas, obviamente, à medida que a matriz aumenta, isso se torna cada vez mais lento.
Alguém tem uma idéia sobre um algoritmo que me permita encontrar esses dados de maneira ideal? Eu já mudei para uma pesquisa binária, que melhorou um pouco as coisas, mas ainda é muito mais lenta do que gostaria, e como não estou procurando um valor específico que exista na matriz, ele nunca pode terminar cedo.
Mais informações: Os valores de ponto flutuante na matriz não são necessariamente distribuídos uniformemente (ou seja, a matriz pode consistir nos valores "1.f, 2.f, 3.f, 4.f, 100.f, 1200.f 1203.f, 1400.f ".
Estou fazendo essa operação centenas de milhares de vezes, mas posso realizar qualquer quantidade de pré-processamento na matriz de flutuadores, se isso melhorar o tempo de pesquisa. Eu absolutamente posso mudar para usar algo diferente de um vetor para armazená-los, se isso ajudar.