二分查找算法,也称为折半查找,是一种在有序数组中查找特定元素的有效方法。它的基本思想是每次通过比较中间元素与目标值来缩小搜索范围,直到找到目标值或者确定目标值不存在。二分查找的时间复杂度为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`时,表示目标值不存在于数组中。 理解并熟练运用二分查找算法对于提高编程效率和解决实际问题具有重要意义。
- 粉丝: 3
- 资源: 939
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Java的DVD租赁管理系统.zip
- (源码)基于Arduino的模型铁路控制系统.zip
- (源码)基于C语言STM32F10x框架的温湿度监控系统.zip
- (源码)基于Spring Boot的极简易课堂对话系统.zip
- (源码)基于JSP+Servlet+MySQL的学生管理系统.zip
- (源码)基于ESP8266的蜂箱监测系统.zip
- (源码)基于Spring MVC和Hibernate框架的学校管理系统.zip
- (源码)基于TensorFlow 2.3的高光谱水果糖度分析系统.zip
- (源码)基于Python框架库的知识库管理系统.zip
- (源码)基于C++的日志管理系统.zip