Javascript 二进制搜索提前退出?

Javascript 二进制搜索提前退出?,javascript,binary-search,Javascript,Binary Search,我试图找到两个数组的副本,其中一个数组大得多,所以我在较小的数组中进行迭代,同时在较大的数组上进行二进制搜索以获取数字。但是,我的解决方案没有运行 function bSearch(arr, num) { let start = 0 let end = arr1.length - 1 while (start <= end) { let middle = Math.round(start + end / 2) if (arr[middle] === num) {

我试图找到两个数组的副本,其中一个数组大得多,所以我在较小的数组中进行迭代,同时在较大的数组上进行二进制搜索以获取数字。但是,我的解决方案没有运行

function bSearch(arr, num) {
  let start = 0
  let end = arr1.length - 1
  while (start <= end) {
    let middle = Math.round(start + end / 2)
    if (arr[middle] === num) {
      return arr[middle]
    } else if (arr[middle] < num) {
      start = middle
    } else {
      end = middle
    }
  }
  return false
}

function dup(arr1, arr2) {
  let output = []
  let shorterArray = arr1.length > arr2.length ? arr2 : arr1
  for (let i = 0; i < shorterArray.length; i++) {
    if (bSearch(arr1, shorterArray[i])) {
      output.push(shorterArray[i])
    }
  }
  return output
}

let arr1 = [1, 2, 3, 5, 6, 7], arr2 = [3, 6, 7, 8, 20]
dup(arr1, arr2)

// should return [3, 5, 7]
// currently only returns [3]

这里有一些小问题

bSearcharr1,shorterArray[i]-如果arr1短,则只搜索它。 在二进制搜索中,使用arr1的长度,而不是arr作为起始端变量declarion

让middle=Math.roundstart+end/2-.以不同的方式进行取整,使用.floor

Math.roundstart+end/2-开始和结束添加应在括号中

二进制逻辑应该增加或减少中间值,否则将进入无限循环,即6+6/2==6

因此:


JsBin:

你肯定是说它应该返回3、6、7?Math.roundstart+end/2我不确定这是否符合你的想法。您可能需要确认此处的操作顺序。如果您发现arr[middle]if (arr[middle] === num) { return arr[middle] } else if (arr[middle] < num) { start = middle + 1 } else { end = middle - 1 }