1什麼是二分搜尋
你玩過「猜數字」遊戲嗎?對方心裡想一個1到100的數字,你每猜一次,對方告訴你「太大」或「太小」。如果你每次都亂猜,運氣不好可能要猜99次才猜到;但如果你每次都猜「目前範圍的中間值」,最多只要猜7次左右就一定找得到——這就是二分搜尋的核心想法:每一次都把可能的範圍砍半,而不是一個一個慢慢找。
這是你第一次真正體會到「同一個問題,方法不一樣,效率差很多」——之前你在清單裡找一個數字,都是從頭到尾一個一個看過去(叫「線性搜尋」),資料越多、要花的時間就跟著等比例變長。二分搜尋只有在資料已經排好順序的前提下才能用,但只要能用,資料再多也只需要一次次砍半,速度快非常多。這也是為什麼你在M1-07/M1-08已經先學過排序法。
猜 1~100 之間的數字 73,每次猜中間值
1
…
50
…
100
猜 50 → 太小 → 丟掉左半邊,只留右半邊
↓
51
75
…
100
猜 75 → 太大 → 丟掉右半邊,範圍再砍半
↓
51
73
74
猜 73 → 命中!只花 3 次,而不是逐一從 1 猜到 100
🆕 補充圖解:每猜一次,可能範圍就砍半,找起來快很多新增
2核心概念,依課程題目的順序拆解
1
判斷目標在不在清單裡
你要做的事:給一個已經由小到大排序的清單,判斷某個目標數字在不在裡面。用二分搜尋的做法:先看清單正中間的數字,如果剛好是目標就找到了;如果目標比中間值小,代表目標只可能在左半邊,直接把右半邊丟掉,只在左半邊繼續找;如果目標比中間值大,同樣道理丟掉左半邊。每比較一次,可能的範圍就砍半,直到找到,或範圍縮到沒東西為止。
神祕數字找找看(M3-00-01)
⚠️ 常見誤區
清單沒有排序就用二分搜尋——二分搜尋能「砍半丟掉一邊」的前提,是清單已經照順序排好,如果清單是亂的,砍掉的那一半可能剛好藏著答案。2
找出目標在清單中的位置
跟概念1幾乎一樣,差別是找到之後不是輸出「有/沒有」,而是輸出目標所在的位置(從第1個算起);如果清單裡沒有,輸出0。
神祕數字在第幾個(M3-00-02)
3
體會「猜的策略」如何影響次數——猜數字裁判
這一題讓你從「玩家」的視角切換到「裁判」的視角:給定正確答案跟一串依序猜測的數字,判斷玩家是第幾次才猜中。寫這支程式本身只需要依序比對每一次猜測,但做這一題的用意是讓你觀察:如果輸入的猜測序列本身就是照「二分搜尋策略」在猜(每次猜目前範圍的中間值),猜中所需的次數會遠比亂猜少很多——這是幫助你建立「為什麼要學二分搜尋」的直覺。
猜數字裁判(M3-00-03)
4
找插入位置——即使沒有完全命中,也要能定位
你要做的事:書架上的書已經照編號排好,決定一本新書該插入第幾個位置,插入後仍要保持排序。這一題比概念1、2更進一步:目標不一定會剛好等於清單裡的某個數字,二分搜尋這時候要做的是「持續砍半,直到範圍剩下一個位置,那個位置就是答案」,而不是「找不到就放棄」。
新書該插第幾格(M3-00-04)
⚠️ 常見誤區
直接照搬概念1「找到相等就停」的寫法,遇到清單裡沒有完全相同的數字時就不知道該怎麼辦——插入位置類的二分搜尋,重點是持續縮小範圍直到只剩一個可能位置,不是在等一個「相等」的時刻。5
一次查詢多筆——同一招重複套用
你要做的事:同一份已排序清單,要查詢很多筆不同的目標值是否存在。這一題沒有新概念——把概念1的做法,對每一筆查詢各自獨立跑一次二分搜尋,重複套用即可。
訂單一次查(M3-00-05)
6
找門檻落點——找「小於等於目標的最大值」
你要做的事:門檻清單由小到大排序,判斷某筆消費金額達到第幾個門檻(即金額大於等於的最大門檻編號;如果沒有達到任何門檻,輸出0)。這是二分搜尋的另一種變化型——你要找的不是「完全相等」,也不是「插入位置」,而是「符合某個條件的最後一個/最大的那個」。
打折門檻落點(M3-00-06)
⚠️ 常見誤區
把概念4(插入位置)跟概念6(門檻落點)的方向搞混——插入位置找的是「第一個比目標大的位置」,門檻落點找的是「最後一個小於等於目標的位置」,兩者的比較方向相反,寫之前先確認題目到底要哪一種。3建議練習順序對照表
| 順序 | 概念 | 題目 | 課程 |
|---|---|---|---|
| 1 | 存在性判斷 | 神祕數字找找看(M3-00-01) | M3-00 |
| 2 | 找出位置 | 神祕數字在第幾個(M3-00-02) | M3-00 |
| 3 | 建立策略直覺 | 猜數字裁判(M3-00-03) | M3-00 |
| 4 | 找插入位置 | 新書該插第幾格(M3-00-04) | M3-00 |
| 5 | 多筆查詢 | 訂單一次查(M3-00-05) | M3-00 |
| 6 | 找門檻落點 | 打折門檻落點(M3-00-06) | M3-00 |
🆕 本頁新增內容說明
以下視覺元素為 Cowork 潤飾時新增,MD 正本中沒有:① 猜數字砍半過程的格子圖(1~100猜73為範例)。若確認保留,建議之後補進 MD 正本。