773 字
4 分鐘
二分搜尋演算法完ssss全指南

二分搜尋演算法完全指南#

二分搜尋(Binary Search)是程式設計中最基礎也最重要的演算法之一。雖然概念簡單,但要寫出正確且高效的實作卻不容易。

什麼是二分搜尋?#

二分搜尋是一種在已排序陣列中尋找特定元素的演算法。它的核心思想是:

  1. 檢查中間元素
  2. 如果中間元素就是目標,返回位置
  3. 如果目標小於中間元素,在左半部分繼續搜尋
  4. 如果目標大於中間元素,在右半部分繼續搜尋

時間複雜度#

  • 時間複雜度: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 + 1right = 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 result

2. 尋找插入位置#

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 left

LeetCode 練習題推薦#

  1. 704. Binary Search - 基礎二分搜尋
  2. 35. Search Insert Position - 尋找插入位置
  3. 34. Find First and Last Position - 尋找範圍
  4. 69. Sqrt(x) - 二分搜尋應用
  5. 153. Find Minimum in Rotated Sorted Array - 進階應用

學習心得#

作為高中生學習演算法,我發現二分搜尋是很好的入門選擇:

  1. 概念簡單:容易理解基本思想
  2. 應用廣泛:很多問題都可以用二分搜尋解決
  3. 細節重要:看似簡單但實作細節很關鍵

建議大家多練習,特別注意邊界條件的處理!

總結#

二分搜尋雖然簡單,但要寫對並不容易。關鍵是:

  • 理解核心思想
  • 注意實作細節
  • 多練習變形題目

希望這篇文章對大家學習二分搜尋有幫助!


參考資料:

  • Introduction to Algorithms by CLRS
  • LeetCode 官方題解
二分搜尋演算法完ssss全指南
https://vic88-web.vercel.app/posts/binary-search-guide/
作者
Vic88
發佈於
2024-12-18
許可協議
CC BY-NC-SA 4.0