773 字
4 分鐘
二分搜尋演算法完ssss全指南
二分搜尋演算法完全指南
二分搜尋(Binary Search)是程式設計中最基礎也最重要的演算法之一。雖然概念簡單,但要寫出正確且高效的實作卻不容易。
什麼是二分搜尋?
二分搜尋是一種在已排序陣列中尋找特定元素的演算法。它的核心思想是:
- 檢查中間元素
- 如果中間元素就是目標,返回位置
- 如果目標小於中間元素,在左半部分繼續搜尋
- 如果目標大於中間元素,在右半部分繼續搜尋
時間複雜度
- 時間複雜度:O(log n)
- 空間複雜度:O(1)(迭代版本)
每次搜尋都能排除一半的元素,所以效率非常高!
基本實作
Python 版本
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = left + (right - left) // 2 # 避免溢位
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1 # 找不到C++ 版本
#include <vector>
using namespace std;
int binarySearch(vector<int>& arr, int target) {
int left = 0, right = arr.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return -1;
}常見陷阱與注意事項
1. 中點計算
❌ 錯誤寫法:mid = (left + right) / 2
✅ 正確寫法:mid = left + (right - left) / 2
原因:避免整數溢位問題。
2. 邊界條件
- 使用
left <= right而不是left < right - 正確更新
left = mid + 1和right = mid - 1
3. 陣列必須已排序
二分搜尋只能用於已排序的陣列!
變形應用
1. 尋找第一個出現位置
def find_first_occurrence(arr, target):
left, right = 0, len(arr) - 1
result = -1
while left <= right:
mid = left + (right - left) // 2
if arr[mid] == target:
result = mid
right = mid - 1 # 繼續往左找
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return result2. 尋找插入位置
def search_insert_position(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = left + (right - left) // 2
if arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return leftLeetCode 練習題推薦
- 704. Binary Search - 基礎二分搜尋
- 35. Search Insert Position - 尋找插入位置
- 34. Find First and Last Position - 尋找範圍
- 69. Sqrt(x) - 二分搜尋應用
- 153. Find Minimum in Rotated Sorted Array - 進階應用
學習心得
作為高中生學習演算法,我發現二分搜尋是很好的入門選擇:
- 概念簡單:容易理解基本思想
- 應用廣泛:很多問題都可以用二分搜尋解決
- 細節重要:看似簡單但實作細節很關鍵
建議大家多練習,特別注意邊界條件的處理!
總結
二分搜尋雖然簡單,但要寫對並不容易。關鍵是:
- 理解核心思想
- 注意實作細節
- 多練習變形題目
希望這篇文章對大家學習二分搜尋有幫助!
參考資料:
- Introduction to Algorithms by CLRS
- LeetCode 官方題解
二分搜尋演算法完ssss全指南
https://vic88-web.vercel.app/posts/binary-search-guide/