Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript中的二进制数组搜索_Javascript_Arrays_Loops - Fatal编程技术网

JavaScript中的二进制数组搜索

JavaScript中的二进制数组搜索,javascript,arrays,loops,Javascript,Arrays,Loops,我似乎无法让这个代码正常工作。如果它们的键在数组中,则代码应警告True,如果它不在数组中,则应警告false。我似乎做得不对。谢谢 <!DOCTYPE HTML> <html lang="en-us"> <head> <meta charset="utf-8"> <title>Search</title> <script type="text/javascript"> function testFun

我似乎无法让这个代码正常工作。如果它们的键在数组中,则代码应警告True,如果它不在数组中,则应警告false。我似乎做得不对。谢谢

<!DOCTYPE HTML>
<html lang="en-us">

<head>
<meta charset="utf-8">
<title>Search</title>
<script type="text/javascript">
    function testFunction() {
        var list = [ 1, 2, 3, 4, 5, 6, 7 ];
        var key = 9;
        var result1 = 0;
        //var result2 = 0;
        result1 = search(list, key);

    }
    function search(list, key) {
        var left = 0;
        var right = list.length - 1;
        while (left <= right) {
            var mid = left + ((right - left) >>> 1);
            var cmp = key - list[mid];
            if (cmp > 0 ){
                left = alert("True");
            } else if (cmp < 0){
                alert("False");
            }else {
                return mid;
            }
                return mid;
            }
        }
</script>
</head>
<h1>Search:</h1>
<button type="button" onclick="testFunction()">Volume</button>
<div id="outputDiv"></div>

</html>

搜寻
函数testFunction(){
var列表=[1,2,3,4,5,6,7];
var-key=9;
var结果1=0;
//var result2=0;
结果1=搜索(列表、键);
}
功能搜索(列表、键){
左向量=0;
var right=list.length-1;
而(左>>1);
var cmp=键列表[mid];
如果(cmp>0){
左=警报(“真”);
}否则如果(cmp<0){
警告(“假”);
}否则{
中途返回;
}
中途返回;
}
}
搜索:
卷

如果您满足这两个条件,您很少会看到这样做而不是
.indexOf
的好处

  • 您的数据已订购
  • 您希望继续扩展它以使用比较器
  • 现在,你似乎没有移动你的中点,但只是返回它,而是尝试类似的方法

    function search(haystack, needle, i, j) {
        var k;
        if (i !== 0 && !i) i = 0;
        if (j !== 0 && !j) j = haystack.length - 1;
        if (needle < haystack[i] || haystack[j] < needle) return false;
        if (i === j) return haystack[i] === needle;
        while (i < j) {
            k = Math.floor(i + (j - i) / 2);
            if (haystack[k] === needle) return true;
            if (haystack[k] < needle) i = k + 1;
            else j = k - 1;
        }
        return (i === j) && (haystack[i] === needle);
    }
    

    编写一个名为search的JavaScript函数,它接受两个参数:一个名为list的数组和一个名为key的数字。该函数必须确定密钥是否存储在列表中。如果数字存储在数组中,则代码应返回true,否则应返回false

    在ECMAScript 6环境中,您可以使用


    也许你可以试试这个二进制搜索功能

    function binarySearch(array, key) {
        var lo = 0,
            hi = array.length - 1,
            mid,
            element;
        while (lo <= hi) {
            mid = ((lo + hi) >> 1);
            element = array[mid];
            if (element < key) {
                lo = mid + 1;
            } else if (element > key) {
                hi = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }
    
    函数二进制搜索(数组,键){
    var lo=0,
    hi=数组长度-1,
    中间,
    元素;
    而(lo>1);
    元素=数组[mid];
    if(元素<键){
    lo=中间+1;
    }else if(元素>键){
    hi=mid-1;
    }否则{
    中途返回;
    }
    }
    返回-1;
    }
    
    我很确定
    >>
    是不正确的…只需使用
    为什么不直接执行
    列表。索引(键)
    ?是的,这对于您尝试执行的操作来说似乎太复杂了。只需执行
    returnlist.indexOf(key)==-搜索功能中的1
    ,无任何内容else@SpencerWieczorek…因为一次搜索很无聊。(但可能是为了一个非常大的数组,或者可能是为了学校作业,或者只是为了学习……)无论如何,我建议找到一个现有的二进制搜索实现(其中有很多,请参阅维基百科),并与当前的实现相比较,慢慢分析它。使用调试器检查边界更改和比较值。@user2864740您是对的,只是太排他性了。我已经重新措辞了谢谢!编辑以将
    i===j
    测试移出循环,测试已完成
    2*次迭代
    =
    在循环和
    中,正如您所看到的,我是一个noob,我正在尝试理解您的代码。以下是我正在做的工作:编写一个名为search的JavaScript函数,它包含两个参数:一个名为list的数组和一个名为key的数字。该函数必须确定key是否存储在list中。如果存储了数字,则代码应返回true在数组中,否则应返回false。将此函数头用于函数:函数搜索(列表,键){@user5500799我在函数中编辑了一个函数,以满足您刚才描述的要求。我原始答案中的函数与此类似(i
    和j参数是可选的,您可以将它们作为参数删除,然后将前3行重新写入var)。我只需调用list
    haystack
    和key
    needle
    (key对于这里的含义来说是一个非常糟糕的标识符名称)。它首先进行测试“是端点之间的
    i..j
    ?”,然后测试“是中点(
    k
    ?”?",如果没有,它会将相关的端点移到我们刚刚测试过的中点旁边,并重复,直到我们的测试位置用完为止。我真的需要在这方面更加努力,与我尝试的方式相比,您使代码看起来非常简单。谢谢!您的代码看起来与我尝试的代码类似,我如何才能让它发出正确或错误的警报?如果找到了键,则为True;如果未找到,则为false?var result=binarySearch(数组,键);if(result>=0){alert(“True”);}否则{alert(“false”);}
    
    function search(list, key) {
        return list.indexOf(key) !== -1;
    }
    
    function search(list, key) {
        return list.findIndex(e => e === key) !== -1;
    }
    
    function binarySearch(array, key) {
        var lo = 0,
            hi = array.length - 1,
            mid,
            element;
        while (lo <= hi) {
            mid = ((lo + hi) >> 1);
            element = array[mid];
            if (element < key) {
                lo = mid + 1;
            } else if (element > key) {
                hi = mid - 1;
            } else {
                return mid;
            }
        }
        return -1;
    }