编程基础篇 · 查找与排序

二分查找:猜数字游戏的最优解

上一课那条最省心的绿线 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 次内锁定元凶。

🎯

猜价格 / 调参数

「这瓶酒多少钱?」「高了」「低了」——综艺里的猜价环节,高手全在心里做二分。调试超参数时的手动逼近也是同款。

✅ 这一课想和你分享的