J'ai un tableau de flotteurs, triés du plus petit au plus grand, et je dois pouvoir choisir le flotteur le plus proche supérieur ou inférieur à une valeur d'entrée transmise. Cette valeur d'entrée n'est pas nécessairement présente en tant que valeur dans le tableau.
Une approche naïve serait de faire une simple recherche linéaire dans le tableau. Cela pourrait ressembler à ceci:
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];
}
}
}
Mais évidemment, à mesure que le tableau s'agrandit, cela deviendra de plus en plus lent.
Quelqu'un at-il une idée d'un algorithme qui me permettrait de trouver ces données de manière plus optimale? Je suis déjà passé à une recherche binaire, ce qui a quelque peu amélioré les choses, mais c'est toujours beaucoup plus lent que je ne le souhaiterais, et comme je ne recherche pas réellement une valeur spécifique qui existe dans le tableau, elle ne peut jamais se terminer de bonne heure.
Plus d'informations: Les valeurs à virgule flottante dans le tableau ne sont pas nécessairement réparties uniformément (c'est-à-dire que le tableau peut être composé des valeurs "1.f, 2.f, 3.f, 4.f, 100.f, 1200.f , 1203.f, 1400.f ".
Je fais cette opération des centaines de milliers de fois, mais je peux faire n'importe quelle quantité de prétraitement sur le tableau de flottants, si cela améliore le temps de recherche. Je peux absolument changer pour utiliser autre chose qu'un vecteur pour les stocker, si cela peut aider.