程式設計基礎篇 · 查詢與排序

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

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

🎯

猜價格 / 調參數

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

✅ 這一課想和你分享的