Ho una serie di float, ordinati dal più piccolo al più grande, e ho bisogno di essere in grado di scegliere il float più vicino maggiore o minore di un valore di input passato. Questo valore di input non è necessariamente presente come valore nella matrice.
Un approccio ingenuo sarebbe quello di fare una semplice ricerca lineare attraverso l'array. Potrebbe apparire così:
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];
}
}
}
Ma ovviamente man mano che l'array diventa più grande, questo diventerà sempre più lento.
Qualcuno ha un'idea di un algoritmo che mi permetta di trovare questi dati in modo più ottimale? Sono già passato a una ricerca binaria, che ha migliorato un po 'le cose, ma è ancora molto più lento di quanto mi piacerebbe, e dal momento che non sto effettivamente cercando un valore specifico che esiste nell'array, non può mai terminare presto.
Ulteriori informazioni: i valori in virgola mobile nell'array non sono necessariamente distribuiti uniformemente (ovvero, l'array potrebbe essere costituito dai valori "1.f, 2.f, 3.f, 4.f, 100.f, 1200.f , 1203.f, 1400.f ".
Sto eseguendo questa operazione centinaia di migliaia di volte, ma posso eseguire qualsiasi quantità di pre-elaborazione sull'array di float, se migliorerà il tempo di ricerca. Posso assolutamente cambiare per usare qualcosa di diverso da un vettore per memorizzarli, se questo mi aiuterà.