[英]increments returning different binary search result
创建了一个简单的二进制搜索,我注意到mid--
与mid -= 1
或mid - 1
的使用返回了不同的结果,并且基本上导致 function 失败。 我正在在线扫描资源并基于阅读其他 SO 帖子,我的假设是--
和++
运算符能够为每次迭代更改mid
的值......但它看起来如此细微以至于我并没有真正跟踪幕后发生了什么。 对此将不胜感激。
我认为mid -= 1
和mid--
意味着取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);
反而。 考虑low
和high
具有不同的奇偶校验。 显然,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.