這聽起來像你想要一個修改的二進制搜索。由於列表按排序順序排列,二進制搜索將極大地提高線性搜索的搜索性能,並且如果對數組中項目的間距不瞭解,則無法比二分查找做得更好。二分法搜索將需要稍微修改,因爲您不是在尋求平等,而是在沒有超過的情況下儘可能接近。
下面是一個實際的算法,保持分割的搜索數據以1/2,直到它下降到僅一個元件(與上半部分或下半部分基於比較將測試值每次去):
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);
}
}
}
而且,工作測試程序:http://jsfiddle.net/jfriend00/rWk2X/
注:此代碼假設陣列中的所有值都在有序和數組不爲空。
如果給它一個沒有小於目標值的值的數組,它將返回0,這可能是一種特殊情況,需要處理,除非確定數組中的第一個值總是小於目標值值(例如總是零)。
如果你給它具有比目標值高出不值的數組,它會在數組中返回的最後一個值(因爲它應該),這是不是一個特例,只是所需的答案。
最簡單的方法:向後循環數組,並選取小於或等於播放頭的第一個元素。你有沒有試過,這對你的用例來說效率太低了嗎? – deceze 2012-02-08 07:28:25
挑戰是*有效*找到...線性搜索效率不高。 – 2012-02-08 07:31:05
儘管如此,它可能很有效*。對於現代機器來說,1500個元素不是那麼重要。 – deceze 2012-02-08 07:32:48