2017-01-18 3 views
-1

この検索コードは、最も近い一致を返します。多くの場合、最も近いmatch.xはtarget.xより小さい。Javascriptバイナリ検索:より大きいか等しいだけで一致しますか?

match.xがtarget.x値以上で、match.yが最も近いy値である場合、どのようにして最も近い一致を返すことができますか?

データはxで昇順にソートされ、yで昇順にソートされます。声明closest match where match.x is greater or equal to target.x value and match.y is the closest y valueに基づいて

var data = [ 
    {"x": 750, "y": 750}, 
    {"x": 750, "y": 850}, 
    {"x": 1000, "y": 500}, 
    {"x": 1000, "y": 1000}, 
    {"x": 2000, "y": 2000}, 
    {"x": 3000,"y": 3000} 
]; 

console.log("Test 800", findClosestMatchGreaterOrEqual({'x': 800,'y': 800})); 
// TEST 800 {x: 750, y: 850} 

console.log("Test 2300", findClosestMatchGreaterOrEqual({'x': 2300,'y': 2300})); 
// TEST 2300 {x: 2000, y: 2000} 

function findClosestMatchGreaterOrEqual(target) { 
    var low = 0; 
    var high = data.length - 1; 
    var item = null; 
    var lastItem = null; 
    while (low <= high) { 
     var mid = ((low + high)/2) | 0; 
     lastItem = item; 
     item = data[mid]; 
     var compare = compareItems(item, target); 
     if (compare > 0) high = mid - 1; 
     else if (compare < 0) low = mid + 1; 
     else return item; 
    } 
    if (Math.abs(lastItem.x - target.x) < Math.abs(item.x - target.x)) return lastItem; 
    return item; 
} 

function compareItems(a, b) { 
    if (a.x != b.x) return a.x - b.x; 
    if (a.y != b.y) return a.y - b.y; 
    return 0; 
} 
+0

あなたはこれを自分で書き換えしようとしたのですか?もしそうなら、何を試しましたか? – andi

+0

function compareItems(a、b){ if(a.x!= b.x && a.x Sparky1

答えて

0

私はあなたに所望の出力を与えるこれを下回ると、あなたの機能を変更しようとしました。

var data = [ 
 
    {"x": 750, "y": 750}, 
 
    {"x": 750, "y": 850}, 
 
    {"x": 1000, "y": 500}, 
 
    {"x": 1000, "y": 1000}, 
 
    {"x": 2000, "y": 2000}, 
 
    {"x": 3000,"y": 3000} 
 
]; 
 

 
function closest(target) { 
 
\t var arr = [],result; 
 
\t for (var i=0; i<data.length; i++) { 
 
\t \t arr.push({index: i, diffy: Math.abs(target.y - \t data[i].y),diffx: Math.abs(target.x - \t data[i].x), x:data[i].x, y: data[i].y}); 
 
    } 
 
    arr = arr.sort(function(a, b) { 
 
    return parseFloat(a.diffy) - parseFloat(b.diffy); 
 
\t }); 
 
    
 
    for (var i=0; i<arr.length; i++) { 
 
\t \t if(arr[i].x >= target.x) { 
 
    \t \t result = arr[i]; 
 
     break; 
 
    } 
 
    } 
 
    console.log(arr); 
 
    console.log(data[result.index]); 
 
    alert(JSON.stringify(data[result.index])); 
 
} 
 

 
closest({"x": 1000, "y": 1600});

+0

あなたの答えをありがとう。あなたのコードはバイナリ検索ではありません – Sparky1

+0

申し訳ありません。しかし、ええ、この答えは、バイナリ検索を使用しようとしていないいくつかの他の人々にとって有用かもしれないが、同じ結果を達成したい:) –

関連する問題