二进制搜索逻辑

时间:2020-07-15 07:59:38

标签: javascript node.js binary-search-tree binary-search

我试图做一个二进制搜索算法,但是我遇到了一个逻辑问题,我不明白为什么这不起作用...

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,则根本不返回任何内容...

2 个答案:

答案 0 :(得分:2)

您的主要问题是:

  1. 您的while循环中的状况。 mid是数组中的索引,而不是元素。您可以使用list[mid]来获取元素的中点。

  2. 您正在将lowhight设置为mid。但是您无需重新检查这些内容(您是否已经在while循环中检查mid的位置)。您可以改用mid+1mid-1

  3. 您对中点的重新计算不正确。您想使用Math.floor((high + low) / 2);(请注意+)来获得高点和低点之间的平均值。

  4. 当前,您的while循环只有在找到匹配项后才会停止。用尽所有可能性后,还需要停止它。可以使用额外的检查来检查低指针是否尚未通过高指针。

  5. 如果找不到该元素,则需要返回一个-1。这可以通过检查您的lowhigh指针来完成。

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');
}