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

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


這篇是分享個人在實作 binary search 時,讓它變得更實用的技巧。

如上篇網友留言,在 AI 時代這些技巧已沒那麼重要,有興趣的網友把這篇當飯後故事看即可。

直接進入主題。

先看上篇教科書版的 binary_search code,

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. 找不到 target 時是會 return -1,
  2. 若 arr 裡有不只一個數字符合 target,會回傳最先找到的 index


我的技巧是在功能的定義做點修正,將改良版 binary_search 規定為:

  1. 若找不到 target,return 它該出現的 index
  2. 若 arr 裡不只一個數字符合 target,回傳第一個的 index


先舉幾個例子幫助理解,

arr = [1, 1, 3, 3, 5, 7, 7],

  • binary_search(arr, 3)
    • returns 2
    • 回傳第一個 3 的 index
  • binary_search(arr, 7)
    • returns 5
    • 回傳第一個 7 的 index
  • binary_search(arr, 8)
    • returns 7
    • arr 內沒有 8,回傳 8 在 arr 裡該出現的 index
  • binary_search(arr, 0)
    • returns 0
    • arr 內沒有 0,回傳 0 在 arr 裡該出現的 index


接續上篇的情境來解釋實用在哪,最後再講實作。


學姊為何要換衣服?為何要綁頭髮?為何呢...

學姊為何要換衣服?為何要綁頭髮?為何呢...


第一種用法,
就是上篇的用法,找出某尺寸的鞋。

arr = [2, 6, 6, 14, 15, 25, 27, 29, 30, 42]
target = 25
index = binary_search(arr, target)

if arr[index] == target:
print(f"找到啦! {target} 號鞋的 index 是 {index}")
else:
print(f"沒有 {target} 號鞋..")

執行結果

$ python binary_search.py
找到啦! 25 號鞋的 index 是 5

若把 target 改成 28

$ python binary_search.py
沒有 28 號鞋..


第二種用法,
拿到新一盒鞋子,要放進排好的盒堆中,並保持順序。

arr = [2, 6, 6, 14, 15, 25, 27, 29, 30, 42]
target = 26
index = binary_search(arr, target)
print(f"{target} 號鞋請放在 index = {index} 的位子!")

執行結果

$ python binary_search.py
26 號鞋請放在 index = 6 的位子!


第三種用法,
若乾爹想要買下某尺寸全部的鞋,可以很快地幫他取出來。

arr = [2, 6, 25, 25, 25, 25, 25, 29, 30, 30]
tar = 25

idx1 = binary_search(arr, target)

if arr[idx1] != tar:
print(f"沒有 {tar} 號鞋 >///<'")
else:
# 找大一號的鞋子,再把 index 減 1
idx2 = binary_search(arr, tar + 1) - 1
print(f"所有 {tar} 號鞋放在 index {idx1} 到 {idx2} 的位子!")

執行結果

$ python binary_search.py
所有 25 號鞋放在 index 26 的位子!

將 target 改成 31

$ python binary_search.py
沒有 31 號鞋 >///<'


以上簡單分享三種用法,只要將 binary_search 定義清楚,就能這樣應用。


再複習一次改良版 binary_search 定義:

  1. 若找不到 target,return 它該出現的 index
  2. 若 arr 裡不只一個數字符合 target,回傳第一個的 index


接下來是實作,其實也不難,概念都一樣。

def binary_search(arr, target):
low, high = 0, len(arr)
while low < high:
mid = (low + high) // 2
if arr[mid] < target:
low = mid + 1
elif arr[mid] > target:
high = mid
else:
high = mid
return low


跟上篇的版本非常類似,留給有興趣的讀者慢慢理解,歡迎留言討論。



偷偷抱怨一下,

code block 真D難用...




留言
avatar-img
JN的沙龍
64會員
38內容數
個人網誌啦~ 內容包含但不限於學習筆記、心情抒發、火星廢文...
JN的沙龍的其他內容
2025/08/08
年少不知姐姐好...
Thumbnail
2025/08/08
年少不知姐姐好...
Thumbnail
2025/01/17
某天,某島國上的花生農老G,因為體力漸衰、氣候異常、地緣政治...等因素,種出的花生品質越來越不穩定,於是邀了其他島上的A格斯先生、高手B爾、阿國兄,四人一起組了個互助會...
Thumbnail
2025/01/17
某天,某島國上的花生農老G,因為體力漸衰、氣候異常、地緣政治...等因素,種出的花生品質越來越不穩定,於是邀了其他島上的A格斯先生、高手B爾、阿國兄,四人一起組了個互助會...
Thumbnail
2025/01/13
下圖為程式碼節錄 把 output 印出來看,會發現有五組數字,每一組數字依序對應到驗證碼圖片
Thumbnail
2025/01/13
下圖為程式碼節錄 把 output 印出來看,會發現有五組數字,每一組數字依序對應到驗證碼圖片
Thumbnail
看更多
你可能也想看
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
由於不是這方面的專業,所以一切靠爬文嘗試,我的學習之路不見得正確,就記錄一下自我學習的過程。若有高手見文願指點一二,實屬我之榮幸。
Thumbnail
由於不是這方面的專業,所以一切靠爬文嘗試,我的學習之路不見得正確,就記錄一下自我學習的過程。若有高手見文願指點一二,實屬我之榮幸。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
5 月將於臺北表演藝術中心映演的「2026 北藝嚴選」《海妲・蓋柏樂》,由臺灣劇團「晃晃跨幅町」製作,本文將以從舞台符號、聲音與表演調度切入,討論海妲・蓋柏樂在父權社會結構下的困境,並結合榮格心理學與馮.法蘭茲對「阿尼姆斯」與「永恆少年」原型的分析,理解女人何以走向精神性的操控、毀滅與死亡。
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—一元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
中學數學基礎練習—二元一次方程式
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
中學數學基礎練習—一元二次方程式
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News