二分查找是程序员面试的送分题,也是谷歌工程师的翻车现场。2006年,Google内部一个搜索模块频繁报错,团队排查后发现:同一个数组、同一个目标值,程序时而找到、时而找不到。调试日志里, mid = (low + high) / 2 这行计算在特定输入下直接溢出,把正数算成了负数,搜索区间瞬间乱套。
问题藏在最不起眼的整数加法里。low和high都是合法索引,但low + high可能先溢出,再除以2。Java的int上限约21亿,一个长度20亿的数组就能触发——这在2006年的搜索索引里不算罕见。
修复方案简单到让人脸红:mid = low + (high - low) / 2。减法先做,加法后做,溢出风险归零。Joshua Bloch在《Effective Java》里专门写过这事,「即使是专家编写的代码,也可能包含难以察觉的缺陷」。
这个bug在教科书里躺了几十年。Knuth的《计算机程序设计艺术》早期版本同样用了错误写法,直到2006年后才修正。如今LeetCode的题解区,高赞回复第一条永远是"注意溢出"。
谷歌工程师当年在邮件列表里吐槽时,大概没想到这个"随机抽风"会成为经典案例。每次面试有人自信满满写出 (low+high)/2,面试官嘴角都会动一下。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.