フロートの配列があり、最小から最大にソートされており、渡された入力値よりも大きいまたは小さい最も近いフロートを選択できる必要があります。この入力値は、必ずしも配列内の値として存在するわけではありません。
素朴なアプローチは、配列全体で単純な線形検索を行うことです。次のようになります。
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];
}
}
}
しかし、明らかにアレイが大きくなるにつれて、これはますます遅くなります。
このデータをより最適に見つけることができるアルゴリズムについて誰かが考えていますか?私はすでにバイナリ検索に切り替えましたが、問題が多少改善されましたが、それでもまだ思ったよりもずっと遅く、配列に存在する特定の値を実際に探しているわけではないため、終了できません早い。
詳細:配列内の浮動小数点値は必ずしも均等に分散されているわけではありません(つまり、配列は値「1.f、2.f、3.f、4.f、100.f、1200.fで構成されている可能性があります」 、1203.f、1400.f "。
私はこの操作を数十万回実行していますが、ルックアップ時間を改善する場合は、フロートの配列に対して任意の量の前処理を実行できます。それを助けるために、私はそれらを保存するためにベクトル以外のものを使うように絶対に変えることができます。