Tengo una serie de flotadores, ordenados de menor a mayor, y necesito poder elegir el flotador más cercano mayor o menor que un valor de entrada pasado. Este valor de entrada no está necesariamente presente como un valor en la matriz.
Un enfoque ingenuo sería hacer una búsqueda lineal simple a través de la matriz. Eso podría verse así:
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];
}
}
}
Pero obviamente, a medida que la matriz se hace más grande, esto se volverá más y más lento.
¿Alguien tiene una idea sobre un algoritmo que me permita encontrar estos datos de manera más óptima? Ya cambié a una búsqueda binaria, que mejoró un poco las cosas, pero sigue siendo mucho más lenta de lo que me gustaría, y como en realidad no estoy buscando un valor específico que exista en la matriz, nunca puede terminar temprano.
Más información: Los valores de coma flotante en la matriz no se distribuyen necesariamente de manera uniforme (es decir, la matriz podría consistir en los valores "1.f, 2.f, 3.f, 4.f, 100.f, 1200.f , 1203.f, 1400.f ".
Estoy haciendo esta operación cientos de miles de veces, pero puedo hacer cualquier cantidad de preprocesamiento en la matriz de flotadores, si mejora el tiempo de búsqueda. Absolutamente puedo cambiar para usar algo que no sea un vector para almacenarlos, si eso ayuda.