2017-03-10 15 views
0

私はバイナリサーチをjavascriptでパターンマッチングで試しています。しかし、多くの場合、問題はそれが失敗することです。パターンマッチングjavascriptでの検索

私はこのコードを試しました。

function binarySearch(ar, el, compare_fn) { 
    var m = 0; 
    var n = ar.length - 1; 
    while (m <= n) { 
     var k = parseInt((n + m)/2); 
     var cmp = compare_fn(el, ar[k]); 
     if (cmp > 0) { 
      m = k + 1; 
      console.log(cmp,m,ar[m],k) 
     } else if(cmp < 0) { 
      n = k - 1; 
      console.log(cmp,n,ar[n],k) 
     } else { 
      return k; 
     } 
    } 
    return -m - 1; 
} 

function compare_number(a, b) { 
    var regExp = new RegExp(a, 'gi'); 
    var match= (regExp.test(b)?0:1); 
    if(match){ 
    match=a.localeCompare(b); 
    } 
    return(match); 
} 

new function test() { 
    var ar = ["job0000ya","job0002","job003","hello","myui",]; 
    var n = binarySearch(ar, "ya", compare_number); 
    console.log([n]); 
}(); 

しかし、この特定のケースでは失敗しているようです。私はそれを可能にすることができます。

+1

ところで、 'new'が始まる生命維持のためのお勧めのキーワードではありません。 'void 'を使うのが良い。これは式を強制的に評価します。 –

+1

バイナリソートでソートされたデータと小/等/より大きな値を返す関数が必要なので、この場合は検索が機能しない可能性がありますが、正規表現ではなく文字列の内部では機能しません2つの文字列の比較と、文字列が最初に来るかどうかを見分けることができません。 –

+0

どのような提案を私はこれを達成することができますか? –

答えて

0

//The binary search algorithm 
 
var binarySearch = (function() { 
 
    /** 
 
    * compare_complex 
 
    * 
 
    * @param {(number | string)} a 
 
    * @param {(number | string)} b 
 
    * @returns {number} 
 
    */ 
 
    function compare_complex(a, b) { 
 
    return a.toString().localeCompare(b.toString()); 
 
    } 
 
    /** 
 
    * compare_number 
 
    * 
 
    * @param {number} a 
 
    * @param {number} b 
 
    * @returns {number} 
 
    */ 
 
    function compare_number(a, b) { 
 
    return a - b; 
 
    } 
 
    /** 
 
    * binarySearch 
 
    * 
 
    * @param {IBinarySearch} [args={ list: [], target: '' }] 
 
    * @returns {number} 
 
    */ 
 
    function binarySearch(args) { 
 
    if (args === void 0) { 
 
     args = { 
 
     list: [], 
 
     target: '' 
 
     }; 
 
    } 
 
    var params = { 
 
     list: [], 
 
     target: '', 
 
     searchThreshold: 10, 
 
     complex: false 
 
    }; 
 
    for (var key in args) { 
 
     if (args.hasOwnProperty(key) && params.hasOwnProperty(key)) { 
 
     params[key] = args[key]; 
 
     } 
 
    } 
 
    var max = params.list.length - 1; 
 
    var min = 0; 
 
    if (params.list[min] == params.target) { 
 
     return min; 
 
    } 
 
    if (params.list[max] == params.target) { 
 
     return max; 
 
    } 
 
    var compare = (params.complex === true ? compare_complex : compare_number); 
 
    while (max - min >= params.searchThreshold) { 
 
     var diff = max - Math.floor((max - min)/2); 
 
     var cmp = compare(params.list[diff], params.target); 
 
     if (cmp == 0) { 
 
     return diff; 
 
     } else if (cmp < 0) { 
 
     min = diff; 
 
     } else { 
 
     max = diff; 
 
     } 
 
    } 
 
    return params.list.slice(min, max).indexOf(params.target) + min; 
 
    } 
 
    return binarySearch; 
 
})(); 
 
//------------SIMULATION------------// 
 
//Global compare function for sorting 
 
function compare_complex(a, b) { 
 
    return a.toString().localeCompare(b.toString()); 
 
} 
 
//Test array 
 
var arr = []; 
 
//Minimum test array length 
 
var arrLength = 1000000; 
 
//Populate 
 
while (arr.length < arrLength) { 
 
    arr = arr.concat(arr, ["job0000ya", "job0002", "job003", "hello", "myui"]); 
 
} 
 
//Target to find in haystack 
 
var target = "job033"; 
 
//Add target to list 
 
arr.push(target); 
 
//Sort list (must be done before search) 
 
arr = arr.sort(compare_complex); 
 
//Actual test 
 
setTimeout(function() { 
 
    console.log("Looking for:", target, "among", arr.length, "rows"); 
 
    var t = Date.now(); 
 
    console.log("Result at index:", binarySearch({ 
 
    list: arr, 
 
    target: target, 
 
    complex: true 
 
    })); 
 
    console.log("Time(ms):", Date.now() - t); 
 
    var index = binarySearch({ 
 
    list: arr, 
 
    target: target, 
 
    complex: true 
 
    }); 
 
    console.log("5 nearest elements:", arr.slice(index - 2, index + 3)); 
 
}, 1000);

関連する問題