在排序演算法之後,我們終於要介紹一個非常經典且實用的搜尋演算法 —— 二元搜尋 (Binary Search)。如果說排序演算法是「把資料整理好」,那麼搜尋演算法就是「如何在整理好的資料中快速找到想要的元素」。二元搜尋憑藉著「折半」的概念,將搜尋的時間複雜度大幅降低。
二元搜尋的基本思想是:
透過「每次將搜尋範圍減半」,演算法的效率大幅提升。
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
# 測試
arr = [1, 3, 5, 7, 9, 11, 13]
print(binary_search(arr, 7)) # 輸出: 3
print(binary_search(arr, 2)) # 輸出: -1
def binary_search_recursive(arr, target, left, right):
if left > right:
return -1
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
return binary_search_recursive(arr, target, mid + 1, right)
else:
return binary_search_recursive(arr, target, left, mid - 1)
# 測試
arr = [1, 3, 5, 7, 9, 11, 13]
print(binary_search_recursive(arr, 7, 0, len(arr)-1)) # 輸出: 3
print(binary_search_recursive(arr, 2, 0, len(arr)-1)) # 輸出: -1
優點 | 缺點 |
---|---|
時間效率高,$O(\log n)$ | 限制多: 必須是有序陣列 |
實作簡單 | 適合靜態資料,不適合頻繁插入刪除的場景 |
遞迴/迴圈皆可實作 | 若資料不排序,必須先排序,否則無法使用 |
二元搜尋是一個簡單卻威力強大的演算法,它清楚展現了「減少搜尋範圍」能帶來的效率提升。雖然它只適用於有序資料,但在演算法設計中,「化問題為二分判斷」是一個常見且強大的思維模式。理解二元搜尋後,往後你在刷演算法題時會發現,許多問題都能用「Binary Search on Answer」這個技巧來解。