変更されたバイナリ検索が必要なようです。リストはソート順であるため、バイナリ検索では線形検索よりも検索パフォーマンスが大幅に向上し、配列内の項目の間隔についてわからない場合はバイナリ検索よりもはるかに優れていません。あなたが平等を探しているわけではないので、バイナリ検索はわずかに変更する必要がありますが、それ以上のことはありません。
var testData = [0,1500,5000,9348,89234,109280,109281,109283,150000];
function findNearest(data, val) {
if (!data || !data.length) {
return(null);
}
var lowest = 0, mid;
var highest = data.length - 1;
while (true) {
if (lowest == highest) {
return(lowest);
}
mid = Math.ceil(((highest - lowest)/2) + lowest);
if (data[mid] == val) {
return(mid);
}
else if (data[mid] < val) {
lowest = mid;
} else {
highest = Math.max(lowest, mid - 1);
}
}
}
:
は、ここでそれだけで一つの要素にまでなるまで(上半分または下半分の試験値との比較に基づいて、各時間一緒に行く)1/2に検索データを分割し続ける実際のアルゴリズムです
そして、作業テストプログラム:http://jsfiddle.net/jfriend00/rWk2X/
注:このコードは、アレイ内のすべての値がソート順序であるとみなし、アレイが空ではありません。
ターゲット値よりも小さい値を持たない配列を与えると、配列の最初の値が常にターゲットよりも小さいことを確認しない限り、扱う必要のある特殊なケースである0が返されます値(例えば、常にゼロ)。
ターゲット値より大きい値を持たない配列を与えると、配列内の最後の値が返されます(これは必要なものです)。これは特別な場合ではなく、必要な答えです。
最も簡単な方法:配列を逆方向にループし、再生ヘッド以下の最初の要素を選択します。これを試しましたか?これはあなたのユースケースではあまりにも非効率的ですか? – deceze
課題は効率的に見つけることです...直線検索は効率的ではありません。 –
でも十分に*効率的かもしれません。現代の機械では1500要素はそれほど多くありません。 – deceze