二分枚举算法结合了二分查找和枚举的思想,主要用于在有序数据或可二分性质的问题中高效寻找解决方案。
一、基本概念
二分查找 (Binary Search)
- 核心思想:在有序数组中,通过不断缩小搜索范围来快速定位目标
- 时间复杂度:O(log n)
- 前提条件:数据必须是有序的
枚举 (Enumeration)
- 核心思想:系统地尝试所有可能的候选解
- 二分枚举是对传统枚举的优化,利用问题的单调性减少尝试次数
二、标准二分查找实现
问题:寻找第一个等于目标的元素
def first_occurrence(arr, target):
left, right = 0, len(arr) - 1
result = -1
while left <= right:
mid = (left + right) // 2
if arr[mid] >= target:
right = mid - 1
if arr[mid] == target:
result = mid
else:
left = mid + 1
return result
问题:寻找方程近似解
## 区间内只有一个解
def find_root(f, low, high, epsilon=1e-6):
while high - low > epsilon:
mid = (low + high) / 2
if f(mid) * f(low) < 0:
high = mid
else:
low = mid
return (low + high) / 2
问题:平方根计算
def my_sqrt(x):
if x < 2:
return x
left, right = 1, x // 2
while left <= right:
mid = (left + right) // 2
if mid * mid == x:
return mid
elif mid * mid < x:
left = mid + 1
else:
right = mid - 1
return right # 返回整数部分