我试图做一个二进制搜索算法,但是我遇到了一个逻辑问题,我不明白为什么这不起作用...
var binarySearch = function(list, num) {
var low = 0, high = list.length - 1, mid = Math.floor((high - low) / 2);
while(mid != num) {
if(num > list[mid]) {
low = mid;
mid = Math.floor((high - low) / 2);
} else {
high = mid;
mid = Math.floor((high - low) / 2);
}
}
return mid;
}
var arr = [1, 3, 4, 5, 8, 10, 43, 55]
binarySearch(arr, 3);
这段代码返回3的罚款,但是如果我输入数字43,则根本不返回任何内容...
答案 0 :(得分:2)
您的主要问题是:
您的while循环中的状况。 mid
是数组中的索引,而不是元素。您可以使用list[mid]
来获取元素的中点。
您正在将low
和hight
设置为mid
。但是您无需重新检查这些内容(您是否已经在while循环中检查mid
的位置)。您可以改用mid+1
或mid-1
。
您对中点的重新计算不正确。您想使用Math.floor((high + low) / 2);
(请注意+
)来获得高点和低点之间的平均值。
当前,您的while
循环只有在找到匹配项后才会停止。用尽所有可能性后,还需要停止它。可以使用额外的检查来检查低指针是否尚未通过高指针。
如果找不到该元素,则需要返回一个-1
。这可以通过检查您的low
和high
指针来完成。
var binarySearch = function(list, num) {
var low = 0, high = list.length - 1, mid = Math.floor((high + low) / 2);
while(list[mid] != num && low <= high) {
if(num > list[mid]) {
low = mid+1;
mid = Math.floor((high + low) / 2);
} else {
high = mid-1;
mid = Math.floor((high + low) / 2);
}
}
return low <= mid ? mid : -1;
}
var arr = [1, 3, 4, 5, 8, 10, 43, 55]
console.log(binarySearch(arr, 55));
通过在while循环中执行相等性检查并移动mid
的计算,可以稍微简化代码:
var binarySearch = function(list, num) {
var low = 0, high = list.length - 1;
while(low <= high) {
var mid = Math.floor((high + low) / 2);
if(list[mid] === num)
return mid;
if(num > list[mid])
low = mid+1;
else
high = mid-1;
}
return -1;
}
var arr = [1, 3, 4, 5, 8, 10, 43, 55]
console.log(binarySearch(arr, 55));
答案 1 :(得分:1)
这是JavaScript中二进制搜索的简单实现:
function binarySearch(arr, x, start, end) {
if (start > end) {
return false;
}
let mid = Math.floor((start + end) / 2);
if (arr[mid] == x) {
return true;
} else if (arr[mid] > x) {
return binarySearch(arr, x, start, mid - 1);
} else {
return binarySearch(arr, x, mid + 1, end);
}
}
let arr = [1, 3, 4, 5, 8, 10, 43, 55]
let x = 43;
if (binarySearch(arr, x, 0, arr.length - 1)) {
console.log(x + ' found');
} else {
console.log(x + ' NOT found');
}