編程基礎篇 · 查找與排序

二分查找:猜數字遊戲的最優解

上一課那條最省心的綠綫 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 次內鎖定元兇。

🎯

猜價格 / 調參數

「這瓶酒多少錢?」「高了」「低了」——綜藝裏的猜價環節,高手全在心裏做二分。除錯超參數時的手動逼近也是同款。

✅ 這一課想和你分享的