别乱用二分查找!这些前提条件你都搞清楚了吗?

什么是"二分查找"?一句话

就是每次从中间砍一半,看看目标在左边还是右边,一步步缩小范围,直到找到或者没找到。

看起来高效又帅气,但它不是万能的。它有几个硬性要求,满足了才有用。


前提一:必须是排好序的数据

这是第一大铁律。不排序?别用。

举个例子:

你去图书馆找《西游记》:

  • 如果书按书名从A到Z排好,你翻到中间一看:"射雕英雄传",比"西游记"靠前,继续翻后半部分,很快找到了。
  • 如果图书馆管理员摆书像堆衣服一样乱,那就别想二分查找了,只能一摞一摞翻。

再比如:

你有一堆苹果,每个上面写着价格,你想快速找到"价格是5元的苹果"在哪。

  • 如果这些苹果已经按价格从低到高排好了,二分查找就派上用场;
  • 如果是杂乱地堆一堆,你只能一个个看。

所以,二分查找就是为有序数据准备的VIP通道,乱的别挤。


前提二:得能比大小

说白了,你要能判断目标值和中间值之间的"关系":到底是大了?小了?还是刚刚好?

举个例子:

你猜同学心里想的数字(1~100):

  • 你每次猜一个,他说"太小"或"太大";
  • 你就能往正确方向收缩;
  • 这就能用二分查找。

但如果你在猜"今天班里谁最开心",这个就很尴尬了:

  • 你问一个人:"你是不是最开心的?"
  • 他回答"也许吧"
  • 然后你问下一个,也说"也许吧"......

你根本没法比较大小,那就没法二分。


前提三:数据结构支持随机访问中间

啥意思?你要能很快拿到中间那一项,不能一点点走过去。

举个例子:

  • 如果你手上是一摞纸质的小说书,你能一翻就翻到中间那一章。
  • 但如果你看的是那种一页页滑的手机小说 App,翻中间要滑很久,那效率就低了。

或者说:

  • 数组(Array)支持按下标直接拿,比如 arr[mid]
  • 链表(LinkedList)就不行,得从头往后走,慢得很,不适合二分查找。

前提四:最好是查"具体值"

你要查的目标,是"有没有42""在哪个位置""第一次出现在哪"等明确的问题。

如果你问的是:

  • "大于42的数有哪些?"
  • "哪个数最接近目标?"

这些模糊问题不是不能用二分,但就需要用变种的版本,得多写几行代码,逻辑也会稍微复杂点。


简单小结一下:

适合用二分查找的场景:

场景 为什么可以用?
查字典里的单词 单词是按字母排序的,可以比大小
猜一个 1~100 的数字 数字有序,能说"太大/太小"
找排好序的快递编号 快递单号升序排序,可以比
找超市价格最低的商品(排好序) 有序+能比较+能跳到中间
网上查一个按时间排序的日志 日志时间排序,可以比大小
相关推荐
shoubepatien16 分钟前
JAVA -- 11
java·后端·intellij-idea
喵个咪29 分钟前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:kratos-bootstrap 入门教程(类比 Spring Boot)
后端·微服务·go
uzong32 分钟前
从大厂毕业后,到小公司当管理,十年互联网老兵的思维习惯阶段复盘
后端
追逐时光者33 分钟前
一个 WPF 开源、免费的 SVG 图像查看控件
后端·.net
谷哥的小弟1 小时前
Spring Framework源码解析——PropertiesLoaderUtils
java·后端·spring·框架·源码
JIngJaneIL1 小时前
基于java+ vue助农电商系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
雷中听风1 小时前
使用字节的源安装rust
开发语言·后端·rust
q_19132846951 小时前
基于Springboot+MySQL+RuoYi的会议室预约管理系统
java·vue.js·spring boot·后端·mysql·若依·计算机毕业设计
一只叫煤球的猫2 小时前
从夯到拉,锐评13个Java Web框架
java·后端·程序员
VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue乡村振兴服务系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计