二分查找算法,也称为折半查找,是一种在有序数组中查找特定元素的有效方法。它的基本思想是每次通过比较中间元素与目标值来缩小搜索范围,直到找到目标值或者确定目标值不存在。二分查找的时间复杂度为O(log n),在大规模数据处理中具有显著优势。
在Python中,实现二分查找的关键在于正确地设定搜索范围。以下是一个简单的二分查找函数`search2`的示例:
```python
def search2(a, m):
low = 0
high = len(a) - 1
while low <= high:
mid = (low + high) // 2
midval = a[mid]
if midval < m:
low = mid + 1
elif midval > m:
high = mid - 1
else:
print(mid)
return mid
print(-1)
return -1
```
这个函数首先初始化搜索范围的低界`low`为0,高界`high`为数组长度减1。然后在一个循环中不断计算中间位置`mid`,并比较`midval`(中间位置的元素)和目标值`m`。如果`midval`小于`m`,则将`low`更新为`mid + 1`;如果`midval`大于`m`,则将`high`更新为`mid - 1`。当找到目标值时返回其下标,否则在循环结束后返回-1表示未找到。
在实际应用中,二分查找可能需要考虑重复元素的情况。例如,在给定数组`nums`中查找目标值`target`的范围,可以使用如下的`searchRange`方法:
```python
class Solution:
def searchRange(self, nums, target):
def binary_search(start, end, value):
while end >= start:
mid = (start + end) // 2
if nums[mid] > target:
end = mid - 1
elif nums[mid] < target:
start = mid + 1
else:
if value == -1:
return mid
elif mid - value >= start and nums[mid - value] == target:
end = mid - value
elif mid + value <= end and nums[mid + value] == target:
start = mid + value
else:
return mid
a = binary_search(0, len(nums) - 1, -1)
b = binary_search(0, len(nums) - 1, 1)
return [a, b]
```
这个`searchRange`方法首先进行两次二分查找,一次寻找目标值的左侧边界,一次寻找右侧边界。通过传递不同的`value`参数,我们可以找到目标值的精确范围。
此外,注意到在脚本中使用`__name__ == "__main__"`来判断脚本是否作为主程序执行。当`__name__`等于` "__main__"`时,表示脚本是直接运行的,而不是被其他程序导入。这是Python中常用的一个条件判断,用于区分脚本的执行方式。
在上述代码中,数组`source`必须是有序的,这样二分查找才能正常工作。在循环中,我们不断调整`low`和`high`,以找到目标值`des`在`source`中的位置。如果找到目标值,`targetIndex`将被更新,并通过`break`退出循环。否则,根据比较结果调整搜索范围。
总结起来,Python实现的二分查找算法主要涉及以下几个关键点:
1. 初始化搜索范围:`low`和`high`分别表示数组的起始和结束下标。
2. 计算中间位置:`mid = (low + high) // 2`,确保向下取整。
3. 比较中间元素:根据`midval`与目标值的关系更新搜索范围。
4. 处理重复元素:在查找范围边界处检查是否存在相同元素。
5. 结束条件:当`low > high`时,表示目标值不存在于数组中。
理解并熟练运用二分查找算法对于提高编程效率和解决实际问题具有重要意义。