编程基础篇 · 查找与排序
二分查找:猜数字游戏的最优解
上一课那条最省心的绿线 O(log n),今天揭开它的真面目。你小时候玩过「我想了个 1 到 100 的数,你猜」吗?猜数字的最优策略,就是计算机科学里最经典的算法之一——二分查找。先玩,再讲理。
交互一 · 猜数字游戏
系统已经想好了一个 1 到 100 之间的数。下面的条带就是全部候选:点任意数字开猜,我会告诉你大了还是小了,被排除的数字会自动变灰。先按直觉乱猜一局记下次数,再点「按二分猜」看标准答案。留意:二分每猜一次,亮着的区域正好砍掉一半。
点条带上任意数字,开始猜 →
0次
为什么最多 7 次?100 个候选,砍一半剩 50,再砍剩 25、12、6、3、1……砍 7 次必然只剩一个。乱猜运气差要猜几十次,运气再好也不稳定;二分不靠运气,它给的是「最坏情况的保证」——这正是工程师最看重的东西。
交互二 · 十亿条数据只要 30 次
「砍一半」的威力在数据大的时候才真正显灵。点下面的数据量,看二分最多要猜几次,再看那条「连续对折」的动画。留意:数据量翻一万倍,次数只是从 7 涨到 20 出头。
最多只需猜
7
次(log₂ n 向上取整)
100 条
粉色条 = 还没排除的候选范围。点上面的数据量按钮,看它连续对折。
⚠️ 重要前提:二分的门票是「先排好序」
猜数字游戏能玩,是因为数字天然有大小顺序——「大了」这个提示才有意义。换成一本页码被打乱的字典,翻到中间发现是「猫」,你完全不知道「狗」在左边还是右边,二分当场失效。所以想享受 O(log n) 的查找,得先付出排序的成本——排序怎么做、贵不贵,正是下一课的主角。
日常真身 · 你其实早就在用二分
翻字典 / 翻通讯录
找「王」不会从第一页翻起:先翻到中间,比一下拼音前后,直接扔掉一半——你手上的动作就是二分。
git bisect 找坏提交
1000 个提交里有一个引入了 bug?git 帮你自动跳到中间的提交测一下,好的砍前半、坏的砍后半,10 次内锁定元凶。
猜价格 / 调参数
「这瓶酒多少钱?」「高了」「低了」——综艺里的猜价环节,高手全在心里做二分。调试超参数时的手动逼近也是同款。
✅ 这一课想和你分享的
- 砍一半的威力:100 个候选 7 次,十亿个候选也只要 30 次——这就是 O(log n)
- 不靠运气,靠保证:二分给的是最坏情况的上限,工程要的就是确定性
- 有序是前提:乱序的字典没法翻,想用二分先付排序的钱(下一课)
- 日常真身:翻字典、git bisect 找坏提交、猜价格,全是二分