javascript - 二分查找提前退出?

标签 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) {
      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]

最佳答案

这里有一些小问题。

  1. bSearch(arr1, ShortArray[i]) - 如果 arr1 很短,则仅搜索它。
  2. 在二分搜索中,您使用 arr1 的长度,而不是 arr 来进行初始 end 变量声明。

  3. let middle = Math.round(start + end/2) - .round() 以不同方式进行舍入,请使用 .floor() .

  4. Math.round((start + end)/2 - startend 加法应放在括号内

  5. 二进制逻辑应该增加或减少中间,否则你最终会陷入无限循环,即 (6 + 6)/2 === 6

因此:

if (arr[middle] === num) {
    return arr[middle]
} else if (arr[middle] < num) {
    start = middle + 1
} else {
    end = middle - 1
}

JsBin:https://jsbin.com/ciyusodisi/edit?js,console

关于javascript - 二分查找提前退出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56728263/

相关文章:

javascript - 是否可以计算用户加入之间的秒数?

javascript - 在按下某个字符后调用函数,但前提是手前有空格

c++ - std::vector 中的二进制搜索

arrays - Swift:二进制搜索标准数组?

lisp - 具有更高级别功能的 lisp 中的二进制搜索

c++ - 二维数组操作和二进制搜索的实现

python - 使用 python 在大型 .txt 中进行二进制搜索(按哈希排序)

javascript - 如何将变量从 jQuery 传递到 SqlDataSource 中的 SelectCommand?

Firefox 中基于 JavaScript 时间的分数

javascript - 使消息消失。 react native