2013-12-14 46 views
0

如何找到數組(或一個數組),其中第一個和第二個數值位於它們之間? 我的意思是未來:包含所需值的範圍的搜索數組

arrays = [[0,453],[454,820],[821,1350]]; 
values = [320,519] 

在這種情況下,我們返回:

[0,1] //320 =< [0,453] < 519 =< [454,820] 

對於值[30,450]:

[0,0] //30 =< [0,453] >= 450 

或[20,1200]:

[0,2] //20 =< [0,453] <1200> [454,820] <1200>= [821,1350] 

我試圖寫簡單而且快速算法但困難(知識的缺乏)對質......並將其寫入「原樣」 ...:

//pseudocode 
arrays = [[0,10074],[1075,1393],[1394,1418]] 
values = [500,700] 
for (i=0;i<arrays.length;i ){ 
    if(arrays[i][0]<values[0]){ 
     first = i; 
     if(arrays[i][1]>values[1]){ 
      second = i; 
     } else if (arrays[i 1][1]>values[1]){ 
      second = i; 
     } 
     return [first, second] 
    } 
} 

是否有此問題的最佳方式?是否值得重寫並完成上面的僞代碼?


@thefourtheye和@Tibos對不起 - 我不能選擇最佳答案。

回答thefourtheye - 非常快速的解決方案,Tibos - 真正乾淨的代碼。

不同的目標 - 不同的最佳答案。

+1

如果該值不在任何範圍內,應該返回什麼? (-1?Null?) – nnnnnn

+0

這看起來不正確'數組[i 1] [1]>值[1]' – elclanrs

+0

我不認爲我的解決方案是緩慢的。顯然還有改進的空間(例如,在整個範圍內使用二進制搜索),但這會增加複雜性。我做了一個jsPerf來測試所有(工作)解決方案的速度,並且我的可疑程度似乎是最快的。如果您發現錯誤,請編輯它。 http://jsperf.com/rangefinder – Tibos

回答

0

我是數組函數方法的忠實粉絲。下面是我將如何編寫代碼:

var arrays = [[0,453],[454,820],[821,1350]]; 
var values = [320,519]; 

var result = values.map(function(value){ 
    for (var i = 0; i<arrays.length; i++) { 
    if (arrays[i][0] > value) return null;  
    if (arrays[i][1] >= value) return i; 
    } 
    return null; 
}); 

console.log(result); // [0,1] 

如果值不在任何範圍內,則返回null。隨意編輯代碼並返回你希望的那個值。

0
var arrays = [[0,453],[454,820],[821,1350]]; 
var values = [320,519]; 
// values = [30,450]; 
// values = [20,1200]; 

var start = -1, end = -1; 
arrays.some(function(data, idx) { 
    if (data[0] > values[1] || data[1] > values[1]) { 
     end = idx; 
     if (start === -1) start = 0; 
     return true; 
    } else if (start === -1 && (data[0] > values[0] || data[1] > values[0])) { 
     start = idx; 
    } 
    return false; 
}); 

console.log(start, end);