2017-04-12 5 views
0

JavaScript用の配列に基づいて要素がどの区間に属するかを判断する方法が見つかりません。私はbisect.bisect_leftの動作をPythonから欲しがっています。ここではいくつかのサンプルコードは次のとおりです。JavaScriptのRのfindInterval()またはPythonのbisect.bisect_leftと同じ

import bisect 
a = [10,20,30,40] 
print(bisect.bisect_left(a,0)) #0 because 0 <= 10 
print(bisect.bisect_left(a,10)) #0 because 10 <= 10 
print(bisect.bisect_left(a,15)) #1 because 10 < 15 < 20 
print(bisect.bisect_left(a,25)) #2 ... 
print(bisect.bisect_left(a,35)) #3 ... 
print(bisect.bisect_left(a,45)) #4 

私はこれが実装するのは簡単だろう知っているが、なぜ車輪を再発明しますか?

+2

_ "なぜホイールを再発明するのですか?" _ - おそらく "ホイール"はまだ存在しません;) –

答えて

2

JavaScriptには二分関数が組み込まれていないので、独自にロールバックする必要があります。ここでは、ホイールの私の個人的な改革は次のとおりです。同じサイズの間隔のために働く以前に受け入れ答えよりも

var array = [10, 20, 30, 40] 
 

 
function bisectLeft (array, x) { 
 
    for (var i = 0; i < array.length; i++) { 
 
    if (array[i] >= x) return i 
 
    } 
 
    return array.length 
 
} 
 

 
console.log(bisectLeft(array, 5)) 
 
console.log(bisectLeft(array, 15)) 
 
console.log(bisectLeft(array, 25)) 
 
console.log(bisectLeft(array, 35)) 
 
console.log(bisectLeft(array, 45)) 
 

 
function bisectRight (array, x) { 
 
    for (var i = 0; i < array.length; i++) { 
 
    if (array[i] > x) return i 
 
    } 
 
    return array.length 
 
}

0

より高速な方法は次のとおりです。

var array = [5, 20, 35, 50] 
 

 
//Intervals: 
 
//  <5: 0 
 
// [5-20): 1 
 
// [20-35): 2 
 
// [35-50): 3 
 
// >=50: 4 
 

 
var getPosition = function(array, x) { 
 
    if (array.length == 0) return; 
 
    if (array.length == 1) return (x < array[0]) ? 0 : 1; 
 
    return Math.floor((x - array[0])/(array[1] - array[0])) + 1 
 
} 
 

 
console.log(getPosition(array, 2)); //0 
 
console.log(getPosition(array, 5)); //1 
 
console.log(getPosition(array, 15));//1 
 
console.log(getPosition(array, 20));//2 
 
console.log(getPosition(array, 48));//3 
 
console.log(getPosition(array, 50));//4 
 
console.log(getPosition(array, 53));//4 
 

 
console.log("WHEN SIZE: 1") 
 
array = [5]; 
 
//Intervals: 
 
// <5: 0 
 
// >=5: 1 
 
console.log(getPosition(array, 3)); 
 
console.log(getPosition(array, 5)); 
 
console.log(getPosition(array, 6));

関連する問題