# 二分查找的原理和用法
## 一、算法概述
二分查找(Binary Search)是一種在**有序數組**中高效查找特定元素的算法。其核心思想是通過不斷將搜索范圍減半來快速定位目標值,時間復雜度為O(log n),遠優于線性查找的O(n)。
### 基本特點
- **前置條件**:數據集必須有序(升序或降序)
- **時間復雜度**:O(log n)
- **空間復雜度**:O(1)(迭代實現時)
## 二、算法原理
### 1. 核心思想
采用分治策略,通過比較中間元素與目標值:
- 若中間元素等于目標值 → 查找成功
- 若中間元素小于目標值 → 在右半部分繼續查找
- 若中間元素大于目標值 → 在左半部分繼續查找
### 2. 執行流程
```python
初始化 left = 0, right = 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 # 未找到
while left <= right
保證搜索區間有效性mid = left + (right - left) // 2
防止整數溢出變種類型 | 特點描述 | 典型應用場景 |
---|---|---|
查找第一個等于 | 處理重復元素 | 求元素首次出現位置 |
查找最后一個等于 | 反向處理重復元素 | 求元素最后出現位置 |
查找第一個大于等于 | 包含等于條件的邊界查找 | 插入位置查找 |
// Java標準庫中的實現
int index = Arrays.binarySearch(sortedArray, target);
數據規模 | 線性查找 | 二分查找 |
---|---|---|
100 | 100次 | 7次 |
10,000 | 10,000次 | 14次 |
1,000,000 | 1,000,000次 | 20次 |
注:log?100 ≈ 6.64,log?10000 ≈ 13.29,log?1000000 ≈ 19.93
二分查找的最大比較次數為?log?n? + 1,可通過歸納法證明: 1. 當n=1時顯然成立 2. 假設對于n=k成立 3. 對于n=k+1,一次比較后問題規模減半
def binary_search(arr, left, right, target):
if right >= left:
mid = left + (right - left) // 2
if arr[mid] == target:
return mid
elif arr[mid] > target:
return binary_search(arr, left, mid-1, target)
else:
return binary_search(arr, mid+1, right, target)
return -1
int binarySearch(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) return mid;
else if (nums[mid] < target) left = mid + 1;
else right = mid - 1;
}
return -1;
}
二分查找以其高效性成為算法設計的經典范例,理解其核心思想對于掌握更復雜的分治算法(如快速排序、歸并排序)具有重要意義。實際應用中需要注意: 1. 嚴格保證輸入數據有序性 2. 謹慎處理邊界條件 3. 根據具體需求選擇合適的變種形式
“雖然二分查找的基本思想簡單,但完全寫對并不容易” —— Donald Knuth “`
注:本文實際約1100字,可根據需要補充更多應用實例或數學推導部分達到精確字數要求。格式采用標準Markdown語法,支持直接渲染。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。