Ich habe eine Reihe von Floats, die vom kleinsten zum größten sortiert sind, und muss in der Lage sein, den nächsten Float auszuwählen, der größer oder kleiner als ein übergebener Eingabewert ist. Dieser Eingabewert ist nicht unbedingt als Wert im Array vorhanden.
Ein naiver Ansatz wäre eine einfache lineare Suche durch das Array. Das könnte so aussehen:
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];
}
}
}
Aber wenn das Array größer wird, wird dies natürlich immer langsamer.
Hat jemand eine Idee zu einem Algorithmus, mit dem ich diese Daten optimaler finden kann? Ich habe bereits zu einer binären Suche gewechselt, die die Dinge etwas verbessert hat, aber sie ist immer noch viel langsamer als ich es gerne hätte, und da ich nicht nach einem bestimmten Wert suche, der im Array vorhanden ist, kann sie niemals beendet werden früh.
Weitere Informationen: Die Gleitkommawerte im Array sind nicht unbedingt gleichmäßig verteilt (dh das Array kann aus den Werten "1.f, 2.f, 3.f, 4.f, 100.f, 1200.f" bestehen 1203.f, 1400f.
Ich mache diesen Vorgang hunderttausend Mal, aber ich kann jede Menge Vorverarbeitung für das Array von Floats durchführen, wenn dies die Suchzeit verbessert. Ich kann mich absolut ändern, um etwas anderes als einen Vektor zum Speichern zu verwenden, wenn das hilft.