編程基礎篇 · 查找與排序
二分查找:猜數字遊戲的最優解
上一課那條最省心的綠綫 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 找壞提交、猜價格,全是二分