二分查找(Binary Search)一种高效地查找算法
2026-09-12 · 算法 · 阅读 2 · 访客 1
二分查找(Binary Search)是一种高效的查找算法,适用于在有序数组中查找特定元素。它的核心思想是通过不断将搜索范围缩小一半来快速定位目标元素。以下是二分查找的详细讲解:
1. 基本思想
二分查找的前提是数组必须是有序的(升序或降序)。算法通过以下步骤实现:
- 确定搜索范围:初始时,搜索范围是整个数组。
- 计算中间位置:找到搜索范围的中间元素。
- 比较中间元素:
- 如果中间元素等于目标值,查找成功。
- 如果中间元素大于目标值,缩小搜索范围到左半部分。
- 如果中间元素小于目标值,缩小搜索范围到右半部分。
- 重复步骤 2-3:直到找到目标值或搜索范围为空。
2. 算法步骤
以下是二分查找的具体步骤:
- 初始化两个指针:
left指向数组起始位置,right指向数组末尾位置。 - 计算中间位置:
mid = left + (right - left) // 2。 - 比较中间元素
arr[mid]与目标值target:- 如果
arr[mid] == target,返回mid。 - 如果
arr[mid] < target,更新left = mid + 1。 - 如果
arr[mid] > target,更新right = mid - 1。
- 如果
- 重复步骤 2-3,直到
left > right,此时查找失败,返回-1。
3. 代码实现
以下是二分查找的 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 # 未找到目标值
# 示例
arr = [1, 3, 5, 7, 9, 11, 13]
target = 7
result = binary_search(arr, target)
print(f"目标值 {target} 的索引是: {result}")
4. 时间复杂度
二分查找的时间复杂度是 O(log n),其中 n 是数组的长度。这是因为每次查找都将搜索范围缩小一半,最多需要 log₂n 次比较。
5. 空间复杂度
二分查找的空间复杂度是 O(1),因为它只使用了常数级别的额外空间(如指针变量)。
6. 优缺点
优点
- 高效:时间复杂度为 O(log n),远优于线性查找的 O(n)。
- 简单:实现逻辑清晰,代码简洁。
缺点
- 要求有序数组:必须对数组进行排序,排序的时间复杂度通常为 O(n log n)。
- 不适合动态数据:如果数据频繁插入或删除,维护有序数组的成本较高。
7. 变种与应用
二分查找有多种变种,适用于不同的场景:
查找第一个等于目标值的元素:
- 在找到目标值后,继续向左搜索。
def binary_search_first(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = left + (right - left) // 2
if arr[mid] >= target:
right = mid - 1
else:
left = mid + 1
if left < len(arr) and arr[left] == target:
return left
return -1
查找最后一个等于目标值的元素:
- 在找到目标值后,继续向右搜索。
def binary_search_last(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
if right >= 0 and arr[right] == target:
return right
return -1
查找第一个大于等于目标值的元素:
- 适用于查找插入位置。
def binary_search_insert(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = left + (right - left) // 2
if arr[mid] >= target:
right = mid - 1
else:
left = mid + 1
return left
8. 应用场景
- 查找有序数组中的元素:如查找字典中的单词、电话号码等。
- 查找边界值:如查找第一个或最后一个等于目标值的元素。
- 数值计算:如在单调函数中查找满足条件的值。
9. 总结
二分查找是一种高效的查找算法,适用于有序数组。它的核心思想是通过不断缩小搜索范围来快速定位目标值,时间复杂度为 O(log n),空间复杂度为 O(1)。在实际应用中,二分查找的变种可以解决多种查找问题,是算法设计和优化中的重要工具。