二元搜尋 (上) 概念與實作

JN-avatar-img
發佈於計算機
更新 發佈閱讀 4 分鐘

情境

學姊把 10 雙鞋按尺寸小到大,由左至右收進 10 個盒子。每雙鞋尺寸有可能一樣也有可能不一樣,唯一確定的是越左邊盒子裡的鞋越小,越右邊越大。

由於盒子沒標示尺寸,若我想從這 10 個盒子找出尺寸 25 號的鞋子,該怎麼找?

  1. 一盒一盒打開來看
  2. 二元搜尋

兩個方法都可以,但當盒子越多,方法 1 所花的時間會線性成長,而方法 2 是對數成長,所以較為省時。例如,若有 1024 個盒子,方法 1 最多需要開 1024 個盒子,方法 2 只需開 10 個盒子。

年少不知姊姊好

年少不知姊姊好

我:「一盒一盒開來看,好慢欸 😧」

學姊:「想學二元搜尋嗎?姊教你 🥰」

概念

在一個排序好的序列中,使用二元搜尋找出自己要的項目,步驟如下:

  1. 從中間選一個
  2. 根據結果決定往左半或右半找
  3. 重複 1 和 2

以開頭的情境為例

  • 排序好的 10 個盒子,裡面鞋子的尺寸依序是:
    • 2, 6, 6, 14, 15, 25, 27, 29, 30, 42
  • 使用二元搜尋找出 25 號鞋子:
    • 從大約中間的位置開一個盒子
      • 2, 6, 6, 14, 15, 25, 27, 29, 30, 42
      • 結果是 15 號,小於 25 號
      • 所以 15 號左邊的盒子都不用看了
    • 往 15 號右邊的盒子找
    • 從大約中間的位置開一個盒子
      • 25, 27, 29, 30, 42
      • 結果是 29 號,大於 25 號
      • 所以 29 號右邊的都不用看了
    • 往 29 號左半邊的盒子找
    • 從大約中間的位置開一個盒子
      • 25, 27
      • 結果是 25 號,找到了!

實作

使用 python

def binary_search(arr, target):
low, high = 0, len(arr) - 1
while low <= high:
mid = (low + high) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
low = mid + 1
else:
high = mid - 1
return -1 # 若沒找到目標,回傳 -1


def print_result(result):
if result > -1:
print(f"尺寸 {target} 的鞋子位於第 {result+1} 個鞋櫃")
else:
print(f"沒有 {target} 號的鞋子呢")


# 測試
arr = [2, 6, 6, 14, 15, 25, 27, 29, 30, 42]

result = binary_search(arr, 25) # 找 25 號鞋
print_result(result)

result = binary_search(arr, 8) # 找 8 號鞋
print_result(result)

執行結果

$ python binary_search.py
尺寸 25 的鞋子位於第 6 個鞋櫃
沒有 8 號的鞋子呢


「還能繼續嗎?」學姊問。



下一篇:二元搜尋 (下) 技巧與應用



留言
avatar-img
JN的沙龍
65會員
37內容數
個人網誌啦~ 內容包含但不限於學習筆記、心情抒發、火星廢文...
JN的沙龍的其他內容
2025/01/17
某天,某島國上的花生農老G,因為體力漸衰、氣候異常、地緣政治...等因素,種出的花生品質越來越不穩定,於是邀了其他島上的A格斯先生、高手B爾、阿國兄,四人一起組了個互助會...
Thumbnail
2025/01/17
某天,某島國上的花生農老G,因為體力漸衰、氣候異常、地緣政治...等因素,種出的花生品質越來越不穩定,於是邀了其他島上的A格斯先生、高手B爾、阿國兄,四人一起組了個互助會...
Thumbnail
2025/01/13
下圖為程式碼節錄 把 output 印出來看,會發現有五組數字,每一組數字依序對應到驗證碼圖片
Thumbnail
2025/01/13
下圖為程式碼節錄 把 output 印出來看,會發現有五組數字,每一組數字依序對應到驗證碼圖片
Thumbnail
2025/01/13
資料集有了,模型兜好了,再來可以開始訓練了。 首先準備 train.py,下圖僅節錄部分程式碼。 圖中包含了大部分的程式和註解,整段 code 也幾乎是公版了,建議簡單看過再自己融會貫通,有問題可以根據執行時的 error log 去解決,也可以留言討論。 此時資料夾應該長這樣
Thumbnail
2025/01/13
資料集有了,模型兜好了,再來可以開始訓練了。 首先準備 train.py,下圖僅節錄部分程式碼。 圖中包含了大部分的程式和註解,整段 code 也幾乎是公版了,建議簡單看過再自己融會貫通,有問題可以根據執行時的 error log 去解決,也可以留言討論。 此時資料夾應該長這樣
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
高中數學主題練習—配方法
Thumbnail
高中數學主題練習—配方法
Thumbnail
高中數學主題練習—配方法
Thumbnail
高中數學主題練習—配方法
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—算幾不等式
Thumbnail
高中數學主題練習—算幾不等式
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
高中數學主題練習—求空間中直線參數式
Thumbnail
高中數學主題練習—求空間中直線參數式
Thumbnail
到了第二個回合,就不太侷限教材了,重點在大量暴露囉
Thumbnail
到了第二個回合,就不太侷限教材了,重點在大量暴露囉
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News