Skip to content
On this page

二分查找法

image.png

按拼音排序的试卷 如何找到嬴政的试卷 我们可以先从最中间获取 然后根据 拼音首字母继续查找 每次 都获取新一轮数据的中间的值 然后我们最后就可以获取到 嬴政了

image.png

查找1000张试卷 最坏的规模需要查找多少次

最快的查找就一次 最坏的 是 最后才找到

image.png

image.png

论证猜想 就是我们获取一个数字 那么这个数除以多少次到一

image.png

一共是 k + 1 项 就是 k + 1 查找

image.png

最终

ts
  T(n) = [log2n] + 1 // 成立
  T(n) = [log2n] + 1 // 成立

如果 遍历 一千个学生 遍历需要多少次 每个人都查找一遍 我们就需要 一千次 但是如果我们使用二分查找法 那么我们只需要 100 次 速度提升了一百倍

image.png

image.png

image.png

image.png

g 等于 每次上一次 查找的 l + r 除以 2 向下取整

把 二分查找 抽象成一个 数组 进行抽象 返回 num 再 a 中的位置 不存在返回 -1

ts
function binarySearch (arr, num) {
  let l = 0; // 查询范围左边界
  let r = arr.length - 1 // 查找范围最终边界 有边界
  let guess // 默认为空

  // while 语句可以在某个条件表达式为真的前提下,
  // 循环执行指定的一段代码,直到那个表达式不为真时结束循环。

  while (l <= r) {
    guess = Math.floor((l + r) / 2)
    // 获取循环不变时
    // guess 等于l,r 中间位置

    if (arr[guess] === num) return guess
    else if (arr[guess] > num) r = guess - 1
    else l = guess + 1
    // 新的循环不变式
  }
  return -1
}
function binarySearch (arr, num) {
  let l = 0; // 查询范围左边界
  let r = arr.length - 1 // 查找范围最终边界 有边界
  let guess // 默认为空

  // while 语句可以在某个条件表达式为真的前提下,
  // 循环执行指定的一段代码,直到那个表达式不为真时结束循环。

  while (l <= r) {
    guess = Math.floor((l + r) / 2)
    // 获取循环不变时
    // guess 等于l,r 中间位置

    if (arr[guess] === num) return guess
    else if (arr[guess] > num) r = guess - 1
    else l = guess + 1
    // 新的循环不变式
  }
  return -1
}
二分查找法 has loaded