您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 二分查找的原理和用法
## 一、算法概述
二分查找(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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。