繁体   English   中英

递增返回不同的二进制搜索结果

[英]increments returning different binary search result

创建了一个简单的二进制搜索,我注意到mid--mid -= 1mid - 1的使用返回了不同的结果,并且基本上导致 function 失败。 我正在在线扫描资源并基于阅读其他 SO 帖子,我的假设是--++运算符能够为每次迭代更改mid的值......但它看起来如此细微以至于我并没有真正跟踪幕后发生了什么。 对此将不胜感激。

我认为mid -= 1mid--意味着取mid并将其值减一。 两者本质上都是将 -1 值重新分配给mid变量。

作品

const sourceArray = [1, 5, 7, 10, 15];

const binarySearch = (array, target) => {
  let low = 0;
  let high = array.length - 1;

  while (low < high) {
    let mid = (low + high) / 2;
    if (array[mid] === target) {
      return mid;
    } else if (array[mid] > target) {
      // if array[mid] > target, set high to mid--
      high = mid--;
    } else {
      // if array[mid] < target, set low to mid++
      low = mid++;
    }
  }
  return [];
};

console.log(binarySearch(sourceArray, 7));
console.log(binarySearch(sourceArray, 10));
console.log(binarySearch(sourceArray, 15));
console.log(binarySearch(sourceArray, 20));

// returns
// 2
// 3
// 4
// []

不起作用

const sourceArray = [1, 5, 7, 10, 15];

const binarySearch = (array, target) => {
  let low = 0;
  let high = array.length - 1;

  while (low < high) {
    let mid = (low + high) / 2;
    if (array[mid] === target) {
      return mid;
    } else if (array[mid] > target) {
      // if array[mid] > target, set high to mid--
      high = mid -= 1;
    } else {
      // if array[mid] < target, set low to mid++
      low = mid += 1;
    }
  }
  return [];
};

console.log(binarySearch(sourceArray, 7));
console.log(binarySearch(sourceArray, 10));
console.log(binarySearch(sourceArray, 15));
console.log(binarySearch(sourceArray, 20));

// returns
// 2
// []
// []
// []

后递减运算符 ( -- ) 返回值,然后递减它,因此如果mid为 3,则您的行:

high = mid--;

high设置为 3,然后将mid减 1,在mid留下 2。

在您的第二个示例中,您在同一行上有两个作业:

high = mid -= 1;

让我们再次使用值为 3 的mid示例。 单个语句中的多个赋值从右到左工作。 首先,您从mid中减去 1 并将值 2 存储在mid 然后,您将该 2 分配给high

首先, while条件应该是low <= high 考虑有一个单一元素的数组,它根本不会进入循环。

其次,你应该使用Math.floor((low + high) / 2); 反而。 考虑lowhigh具有不同的奇偶校验。 显然,mid 将是一个分数值。 例如,您将访问未定义的sourceArray[2.5]

最后,您应该使用前缀 increment 和 decrement,因为它们在递增和递减后返回它们的值,即--mid++mid

我在您的代码中所做的修改:

const sourceArray = [1, 5, 7, 10, 15];

const binarySearch = (array, target) => {
  let low = 0;
  let high = array.length - 1;

  while (low <= high) {
    let mid = Math.floor((low + high) / 2);
    if (array[mid] === target) {
      return mid;
    } else if (array[mid] > target) {
      // if array[mid] > target, set high to mid - 1
      high = --mid;
    } else {
      // if array[mid] < target, set low to mid + 1
      low = ++mid;
    }
  }
  return [];
};

console.log(binarySearch(sourceArray, 7));
console.log(binarySearch(sourceArray, 10));
console.log(binarySearch(sourceArray, 15));
console.log(binarySearch(sourceArray, 20));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM