javascript - 为什么这种二进制搜索实现会使浏览器无响应?

标签 javascript arrays binary-search

我已经在我的 chrome 控制台中尝试了二进制搜索。但是当我运行代码时,整个 chrome 都挂了,我不得不关闭页面:

var arr = [1, 3, 5, 8];
var binary = function (arr, search) {

    var low = 0;
    var high = arr.length - 1;
    var mid = (high + low) / 2;
    while (low <= high) {

        if (search === arr[mid]) {

            return mid;
        } else if (search > arr[mid]) {
            low = mid + 1;

        } else {
            high = mid - 1;
        }

    }
    return -1;
};

console.log(binary(arr, 3));

最佳答案

问题出在这一行

var mid = (high + low) / 2;

由于 mid 是一个浮点值,arr[mid] 总是返回 undefined。你可以确认这一点,像这样

var arr = [1, 3, 5, 8];
console.log(arr[1.5]);
// undefined

解决方案

  1. 要解决此问题,您可以将其转换为整数,如下所示

    var mid = parseInt((high + low) / 2, 10);
    
  2. 正如 Rick 在评论中指出的那样,mid 计算必须发生在 while 循环中。所以,while 循环看起来像这样

    while (low <= high) {
        mid = parseInt((high + low) / 2, 10);
        if (search === arr[mid]) {
            return mid;
        } else if (search > arr[mid]) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }
    

关于javascript - 为什么这种二进制搜索实现会使浏览器无响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30736772/

相关文章:

javascript - 以编程方式将焦点放在 ng-grid 中的第一行

java - 我的findCombos方法不起作用,如何从Java字符数组中删除字符

c - 在C中将一个数组中的项目附加到另一个数组的末尾

algorithm - 如何确定二进制搜索中的边界或迭代次数?

algorithm - Ladder/Eggs 测试无限阶梯和无限数量的鸡蛋

javascript - 如何将两天之间的类(class)设置为日期选择器?

javascript - 检测响应式网站图标的网站图标尺寸

javascript - 如何在父div中制作一个固定的div

java - Java Poem Palindrome Checker:依次遍历数组匹配元素

java - 如果它是 Java 中的整数数组,如何检查 null 元素?