当前位置: 首页 > news >正文

“二分查找” 咋用?像 “查字典翻页码”,3 步找到目标值​

很多零基础小伙伴觉得 “二分查找” 是 “复杂的算法技巧”,其实它就是 “在有序数组里快速找目标值的方法”—— 就像查字典时,你不会从第一页逐页翻到目标字,而是先翻到中间页,判断目标字在左边还是右边,再缩小范围继续找。今天用 “查字典” 的类比,讲透二分查找的前提、3 步核心步骤及考试高频考点,搭配实操示例和真题,让你 10 分钟就能掌握,考试遇到这类题轻松拿分。​

先明确:为啥要学二分查找?考试性价比超高!​

二分查找是数据结构与算法模块的 “高频考点”,上午选择题每年 1 道(比如 “二分查找的前提”“查找次数计算”),下午算法题偶尔考 “补全二分查找代码”,占算法模块 20% 的分值。而且它的逻辑固定,记清 “查字典” 的 3 步流程,就能应对所有考题,性价比远超其他复杂算法。​

用 “查字典” 理解二分查找:核心逻辑一看就懂​

假设你要查字典里的 “查” 字(拼音 “chá”),字典共 1000 页(页码 1-1000,对应有序数组 [1,2,...,1000]),目标是找到 “查” 字所在的页码(对应目标值)。你不会从第 1 页开始翻,而是这样操作:​

  1. 先翻中间页:翻到第 500 页,看这一页的拼音范围;​
  2. 判断方向:“chá” 在 “a-zh” 的中间偏后,第 500 页的拼音是 “m” 左右,所以 “查” 字在 501-1000 页(排除 1-500 页);​
  3. 缩小范围再找:在 501-1000 页里,翻到中间页 750 页,继续判断方向…… 重复直到找到目标页码。​

这就是二分查找的核心逻辑:每次通过 “折半” 把查找范围缩小一半,减少查找次数,比 “逐个数找(顺序查找)” 高效得多(比如 1000 个元素,顺序查找最多 1000 次,二分查找最多 10 次)。​

第一步:明确二分查找的 “前提”—— 必须是 “有序数组”​

这是二分查找的 “生命线”,就像查字典的前提是 “字典页码按拼音 / 部首排序”,如果数组无序(比如 [3,1,5,2]),根本没法判断目标值在左边还是右边,二分查找完全用不了。​

考试考点: 选择题常考 “下列哪种情况适合用二分查找?”,答案必须是 “有序数组”(升序或降序,考试中以升序为主)。​

第二步:3 步学会二分查找(以升序数组为例)​

以 “有序数组 [1,3,5,7,9,11,13],找目标值 7” 为例,拆解每一步操作,对应 “查字典” 的流程,零基础也能跟着算:​

三步核心流程(升序数组通用)​

步骤​

操作逻辑(大白话版)​

查字典类比​

1. 定范围​

定义左边界(left)=0(数组第一个元素索引)、右边界(right)= 数组长度 - 1(最后一个元素索引)​

确定字典查找范围(如 1-1000 页)​

2. 找中间​

计算中间位置(mid)=left + (right-left)/2(避免溢出,考试常用写法)​

翻到查找范围的中间页(如 500 页)​

3. 比大小​

① 若目标值 = mid 位置的值→找到,结束;② 若目标值 > mid 位置的值→目标在右半区,更新 left=mid+1;③ 若目标值 < mid 位置的值→目标在左半区,更新 right=mid-1​

① 中间页就是目标字→找到;② 目标字在右边→范围改中间页 + 1 到右边界;③ 目标字在左边→范围改左边界到中间页 - 1​

重复步骤 2-3,直到 left>right(没找到目标值)或找到目标值。​

实操示例:在 [1,3,5,7,9,11,13] 中找 “7”​

数组长度为 7,元素索引 0-6(left=0,right=6),一步步演示:​

1.第一次循环:​
  • mid = 0 + (6-0)/2 = 3(中间索引 3,对应值 7);​
  • 目标值 7 == mid 值 7→找到目标!位置在索引 3。​

结果:仅 1 次就找到目标值,比顺序查找(需要找第 4 个元素)快得多。​

拓展示例:找 “9”(目标值在右半区)​

同样数组 [1,3,5,7,9,11,13],找目标值 9:​

1..第一次循环:​
  • mid=3(值 7),9>7→目标在右半区,更新 left=3+1=4(新范围 4-6);​
2.第二次循环:​
  • mid=4 + (6-4)/2 = 5(值 11),9<11→目标在左半区,更新 right=5-1=4(新范围 4-4);​
3.第三次循环:​
  • mid=4 + (4-4)/2 =4(值 9),9==9→找到目标!位置在索引 4。​

结果:3 次找到目标值。​

特殊情况:找 “8”(没找到目标值)​

数组 [1,3,5,7,9,11,13],找目标值 8:​

  1. 第一次循环:mid=3(7),8>7→left=4(范围 4-6);​
  2. 第二次循环:mid=5(11),8<11→right=4(范围 4-4);​
  3. 第三次循环:mid=4(9),8<9→right=3(范围 4-3,此时 left>right);​

结果:left>right,说明数组中没有 8,查找结束。​

第三步:考试高频考点(必记!)​

零基础不用记完整代码,只要掌握这 3 个考点,就能应对 90% 的考题:​

考点 1:二分查找的前提(每年考)​

必须是 “有序数组”(升序或降序),如果题目中数组无序,要先排序再用二分查找(但排序会改变原数组,考试中一般直接给有序数组)。​

真题示例(2023 上午第 45 题):下列数据结构中,适合使用二分查找的是?​

A. 无序数组 B. 有序链表 C. 有序数组 D. 栈​

解析: 二分查找需要快速定位中间元素,链表无法直接找中间元素,栈和无序数组不满足前提,答案 C。

考点 2:中间位置 mid 的计算(代码补全常考)​

考试中常用 “mid = left + (right - left)/2”,而不是 “mid = (left + right)/2”—— 因为当 left 和 right 很大时,(left+right) 可能溢出(比如 left=2¹⁰,right=2¹⁰,相加超过整数范围),前者能避免溢出。​

代码片段(Java 示例):​

int left = 0;
int right = arr.length - 1;
while (left <= right) {int mid = left + (right - left) / 2; // 考试常考填空处if (arr[mid] == target) {return mid; // 找到目标} else if (arr[mid] < target) {left = mid + 1; // 目标在右半区} else {right = mid - 1; // 目标在左半区}
}
return -1; // 没找到
考点 3:查找次数计算(选择题常考)​

查找次数 =“缩小范围的次数”,最多不超过 “log₂n +1”(n 是数组长度,log₂n 取整数)。比如 n=7(示例数组),log₂7≈2.8,最多 3 次(如找 9 用了 3 次);n=1000,log₂1000≈10,最多 10 次。​

真题示例(2022 上午第 46 题):对长度为 16 的有序数组进行二分查找,最多需要多少次就能确定目标值是否存在?​

A. 4 B. 5 C. 6 D. 7​

解析: log₂16=4,最多需要 4+1=5 次(或直接想 2⁴=16,4 次能缩小到 1 个元素,第 5 次判断是否相等),答案 B。​

零基础避坑:2 个常见错误(别踩!)​

  1. 循环条件写错:循环条件是 “left <= right”,不是 “left < right”—— 前者会检查最后一个元素(如找 9 时,最后范围 4-4 会进入循环),后者会漏掉最后一个元素;​
  2. 更新边界时漏加 / 漏减 1:目标值 > mid 值时,更新 left=mid+1(不是 left=mid);目标值 < mid 值时,更新 right=mid-1(不是 right=mid)—— 否则会导致范围无法缩小,陷入死循环(比如找 7 时,若 left=mid,会一直停在 mid=3)。​

真题练手:2 道题带你秒会​

1.(2023 上午第 45 题)下列关于二分查找的说法,正确的是?​

        A. 二分查找可以在无序数组中使用​

        B. 二分查找的时间复杂度是 O (n)​

        C. 二分查找每次将查找范围缩小一半​

        D. 二分查找不需要判断目标值与中间值的大小​

解析: A(需有序数组)、B(时间复杂度 O (log₂n))、D(需要比较大小)错误;C(每次缩小一半范围)正确,答案 C。​

2.(2021 上午第 47 题)在有序数组 [2,5,8,12,16,23,38,56,72,91] 中查找 23,第几次查找时会找到目标值?​

        A. 2         B. 3         C. 4         D. 5​

解析: 步骤:① left=0,right=9→mid=4(16),23>16→left=5;② mid=5+(9-5)/2=7(56),23<56→right=6;③ mid=5+(6-5)/2=5(23)→找到,共 3 次,答案 B。​

总结:1 句口诀 + 3 步模板(直接背!)​

  1. 口诀:“有序数组用二分,中间比较定左右,left 加 1 右减 1,范围缩到找到止”;​
  2. 3 步模板(升序数组):​

① 定范围:left=0,right = 数组长度 - 1;​

② 找中间:mid=left+(right-left)/2;​

③ 比大小:等于找着,大了左加 1,小了右减 1,重复到 left>right。​

通过 “查字典” 的类比,二分查找的逻辑会变得非常直观,后续复习时拿 2-3 个有序数组练手,就能熟练掌握,考试遇到这类题再也不用慌。

http://www.dtcms.com/a/540549.html

相关文章:

  • 在Ubuntu中使用Docker打包程序(Conda, pip)
  • 网站优化软件费用大连网站推广优化
  • 31_AI智能体工具插件之增强LangChain注册工具构建高效可控的AI工具生态
  • 怎么做自建站wordpress 导航加图标
  • 解决uni-app通用上传与后端接口不匹配问题:原生上传文件方法封装 ✨
  • 管廊建设网站线上推广网络公司
  • 汽车交互式系统专利拆解:VR/AR 画面生成与挡风玻璃异步转换的流畅性测试
  • Python爬虫实战:中信标普 50 指数数据获取与趋势分析
  • 浦江网站建设站酷app
  • 什么是技术架构、数据架构、业务架构、应用架构、产品架构和项目架构?
  • LLaMA-Factory 集成了哪些超参数调优框架?及 Optuna + Weights Biases + TensorBoard对比分析
  • 【软考架构】案例分析:MongoDB 如何存储非结构化数据以及其矢量化存储的优点。
  • 网络共享总失败?先检查是否有计算机名冲突
  • 最好用的企业网站cms湘潭网站建设工作室
  • 在网站后台做网页河南省工程建设协会网站
  • 【k8s】Deployment、StatefulSet、DaemonSet
  • 优购物官方网站订单查询烟台建设科技网站
  • qrc机制——Qt
  • [尚硅谷-尚庭公寓0-90做了部分]
  • 外资企业可以在中国境内做网站吗自己做网站买东西
  • 百度脑图网站建设流程图php网站模板源码下载
  • TDengine 数学函数 SQRT 用户手册
  • 【Qt C++ QSerialPort】QSerialPort fQSerialPortInfo::availablePorts() 执行报错问题解决方案
  • 鸿蒙ArkUI布局与样式进阶(十四)——剩余参数 · 展开运算符 · 接口继承 · 接口实现 · 泛型全面讲解
  • 【# Python 离线安装:把 pip 源设为本地目录】
  • 在pycharm中install不上需要的包
  • 国外工业设计网站建站系统软件有哪些
  • 做网站毕业设计华建河北住房和城乡建设厅网站
  • 公司网站免费建站西安网站工作室
  • 20.13 ChatPPT v3.0多模态图像处理实战:突破93.2%准确率的技术揭秘