二分查找算法

二分查找算法,也称折半搜索算法,是一种在有序数组中查找特定元素的高效算法,其基本思想是每次将待查找的区间减半,通过比较中间元素与目标值的大小来缩小查找范围,直到找到目标值或区间缩小到无法再分。
1、前提条件:必须是一个有序序列。
2、过程描述:
确定序列的中间位置。
比较中间元素与目标值:
若相等,则查找成功。
若中间元素小于目标值,则在右半部分继续查找。

若中间元素大于目标值,则在左半部分继续查找。
重复上述步骤,直至找到目标值或搜索区间为空。
算法步骤
设arr
为有序数组,left
和right
分别是搜索区间的起始和结束位置,target
为要查找的目标值。
1、初始化left = 0
,right = len(arr) 1
。
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
。
3、如果left > right
,说明target
不在数组中,返回1(查找失败)。
算法复杂度
时间复杂度:O(log n),其中n是数组的长度,因为每次迭代都会将搜索区间减半。
空间复杂度:O(1),只需要常数级的额外空间。
算法示例
假设有如下有序数组arr = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
,我们要查找数字11
的位置。
迭代 | left | right | mid | arr[mid] | 操作 |
1 | 0 | 10 | 5 | 9 | right = mid 1 |
2 | 6 | 10 | 8 | 15 | left = mid + 1 |
3 | 6 | 7 | 6 | 11 | 返回mid (查找成功) |
我们找到了数字11
在数组中的位置,即索引6
。
代码实现
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
应用场景
适用于大数据量的查找问题,如数据库索引、字典查找等。
可用于任何能够进行顺序比较的元素集合,不仅限于数值类型。
注意事项
必须是有序序列才能使用二分查找。
对于小规模数据,线性查找可能更高效。
二分查找只能找到一个目标值的索引,如果存在多个相同的元素,它只返回其中一个索引。
相关问题与解答
Q1: 二分查找算法是否可以用于链表数据结构?
A1: 可以,但效率不高,由于链表不支持随机访问,每次访问中间节点都需要从头节点开始遍历,这会导致算法的时间复杂度退化为O(n),通常二分查找更适用于支持随机访问的数据结构,如数组。
Q2: 如果数组中有多个相同的元素,二分查找会返回哪一个索引?
A2: 二分查找返回的是满足条件的任一索引,通常是遇到的第一个匹配项,如果需要找到所有相同元素的索引,可以在找到第一个匹配项后,向左和向右扫描以找到所有匹配的元素。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复