news 2026/10/2 7:13:27

057二分查找

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
057二分查找

二分查找 - 每次消灭一半可能性

057二分搜索:对半分的艺术

📰 5W1H 发明者故事

Who(何人)- 发明者是谁?

发明者:约翰·莫奇利(John Mauchly,ENIAC发明者之一,1946年提出);计算机科学界通常将其正式描述归功于多人
背景:莫奇利(1907-1980)是ENIAC的联合发明者,美国物理学家和计算机先驱。二分查找的思想更古老——图书馆员翻字典时就用"折中"法——但莫奇利在1946年的讲座中首次将其形式化为计算机算法。然而,第一个正确的无bug二分查找程序,直到1962年才由德里克·莱默(Derrick Henry Lehmer)写出。克努斯指出:大多数程序员写的二分查找都有整数溢出的bug(直到2006年才被谷歌工程师发现)。

当时的处境:1946年,ENIAC刚刚建成。如何在大量数据中快速找到目标,是早期计算机最实际的需求之一。电话簿、词典、银行账户——如何用最少的比较次数找到目标?

When(何时)- 什么时候发明的?

时间:1946年(莫奇利讲座);1960年代(第一个无bug实现)
时代背景:

  • 1946年:ENIAC问世,计算机时代开始
  • 1952年:IBM701商业电脑,大规模数据处理需求出现
  • 克努斯1973年出版TAOCP第三卷,对二分查找进行了详细分析
  • 2006年:谷歌工程师约书亚·布洛克(Joshua Bloch)撰文指出Java标准库二分查找的整数溢出bug(mid = (low+high)/2 在large indices时溢出)

Where(何地)- 在哪里发明的?

地点:宾夕法尼亚大学(ENIAC所在地),后来在贝尔实验室进一步完善
环境:二战后的美国,大量军事和商业数据处理需求推动了搜索算法的研究。

What(何事)- 发明了什么?

算法:二分查找(Binary Search)
核心思想:在有序数组中,每次检查中间元素。如果目标等于中间元素则找到;如果目标更小,则在左半段继续;如果更大,则在右半段继续。每次比较消灭一半的搜索空间。

时间复杂度:O(log n)——n=10亿时,最多只需约30次比较。

著名bug:

intmid=(low+high)/2;/* 当 low+high > INT_MAX 时溢出! */intmid=low+(high-low)/2;/* 正确写法 */

Why(何因)- 为什么发明?

问题:顺序查找(从头到尾)是O(n)。对于10亿条记录,每次查找要检查平均5亿条——不可接受。
洞察:如果数据有序,每次比较可以排除一半的元素,最多 log₂(n) 次即可找到答案。
现实动力:电话本、数据库、字典索引——都是有序的,都需要快速查找。

How(何果)- 如何实现?有什么影响?

历史影响:

  • 数据库索引(B树)是二分查找的推广,支持动态插入
  • 编译器的符号表查找
  • 操作系统的内存页表查找
  • 克努斯在TAOCP中专门讨论了"二分查找的正确实现",警告了常见错误
  • lower_bound / upper_bound(C++ STL)是二分查找的扩展

📝 自然语言需求定义

需求名称:实现二分查找,包含迭代版、递归版、lower_bound和upper_bound

功能需求

  1. 迭代二分查找:在有序数组中找target,返回下标或-1
  2. 递归二分查找:同上,用递归实现
  3. lower_bound:返回第一个 ≥ target 的下标
  4. upper_bound:返回第一个 > target 的下标(即target范围的右边界)
  5. count_occurrences:统计target在有序数组中出现次数

验收标准

编号测试场景预期结果验证方式
1查找存在的元素(11)在[1,3,…,19]下标5直接验证
2查找第一个元素(1)下标0直接验证
3查找最后一个元素(19)下标9直接验证
4查找不存在的元素(6)-1直接验证
5递归与迭代结果一致所有元素一致批量对比
6lower_bound/upper_bound in [1,2,2,2,3]lb=1, ub=4, count=3直接验证
7单元素数组找到返回0,找不到返回-1边界条件

💻 C语言实现文件

对应文件:binary_search.c

编译运行:

gcc-obinary_search_test binary_search.c ./binary_search_test
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/2 7:13:21

激光打标机厂推荐:全自动视觉定位设备生产厂家质量参考评选

南京鼎信机电设备有限公司,是一家专注于激光打标机、气动打标机及激光焊接设备研发生产的制造型企业,成立于2009年,深耕工业标记细分领域十余载。一句话概括企业定位:以质取信、以信为本,为各类制造工厂提供稳定耐用、…

作者头像 李华
网站建设 2026/10/2 7:13:19

Redis八股高频面试总结个人开源笔记

redis底层数据结构 Redis对外暴露了5种基本数据类型,但底层为了兼顾内存效率和操作性能,实际使用了多种物理数据结构。同一种上层类型在不同数据量下,底层类型还会自动切换。 1.String底层数据结构是SDS,简单动态字符串&#xff0…

作者头像 李华
网站建设 2026/10/2 7:12:46

ESP32 External RAM failed memory test报错排查与解决

玩ESP32遇到这行日志“External RAM failed memory test!”,十有八九是板子刚焊好、PSRAM刚贴上去,或是换了一颗Flash/PSRAM之后上电就卡死在启动阶段。ESP32在启动流程里会自动检测并用缓存控制器测试外部SPI RAM,这个测试一旦不过&#xff…

作者头像 李华
网站建设 2026/10/2 7:12:05

动态目标三维重构在应急盲区目标运动推演中的应用

摘要灾害坍塌、楼宇搜救、山林抢险、城市巷战等应急处置场景普遍存在大量视觉盲区与动态遮挡,墙体隔断、废墟堆叠、浓烟水雾、地形沟壑、设备遮挡极易造成救援人员、作业装备、被困目标短时消失、视野失联、轨迹断裂,形成应急态势感知“盲空地带”。传统…

作者头像 李华
网站建设 2026/10/2 7:11:02

OPLS-AA电解液建模:力场组合、拓扑校准与LAMMPS实践指南

1. 为什么电解液建模非得从OPLS-AA力场起步?——一个被低估的“基础陷阱”你刚打开LAMMPS,准备跑个电解液模拟,心里想着:“不就是建个盒子、放点离子、加个力场、run一下?”结果一上手就卡在第一步:分子拓扑…

作者头像 李华