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

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
留言分享你的想法!
avatar-img
JN的沙龍
63會員
34內容數
個人網誌啦~ 內容包含但不限於學習筆記、心情抒發、火星廢文...
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
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
還在煩惱平凡日常該如何增添一點小驚喜嗎?全家便利商店這次聯手超萌的馬來貘,推出黑白配色的馬來貘雪糕,不僅外觀吸睛,層次豐富的雙層口味更是讓人一口接一口!本文將帶你探索馬來貘雪糕的多種創意吃法,從簡單的豆漿燕麥碗、藍莓果昔,到大人系的奇亞籽布丁下午茶,讓可愛的馬來貘陪你度過每一餐,增添生活中的小確幸!
Thumbnail
高中數學主題練習—配方法
Thumbnail
高中數學主題練習—配方法
Thumbnail
高中數學主題練習—配方法
Thumbnail
高中數學主題練習—配方法
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—根式化簡
Thumbnail
高中數學主題練習—算幾不等式
Thumbnail
高中數學主題練習—算幾不等式
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
Thumbnail
這篇文章介紹了排列和組閤中的錯位排列和排容原理,並提供了一種相對樸實的解題方法。透過例子詳細解釋了選擇情況下的數學原理,讓讀者能夠理解並吸收。文章通過課堂上難以推敲的題目,提出了一個相對簡單的方式來解題。 圖片選自@pngtree
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News