二分查找(Binary Search)是一种高效的查找算法,用于在有序数组中查找特定元素。它通过不断将搜索范围缩小一半,从而快速定位目标元素。
一、二分查找的基本步骤
1. 初始化:设置两个指针,`start`(指向数组的起始位置)和 `end`(指向数组的末尾)。
2. 计算中间位置:通过公式 `mid = (start+ end) // 2` 计算当前范围的中间索引。
3. 比较中间元素:
如果中间元素等于目标值,返回该索引或True。
如果中间元素小于目标值,则目标值只可能在右半部分,因此更新 `start= mid + 1`。
如果中间元素大于目标值,则目标值只可能在左半部分,因此更新 `end= mid - 1`。
4. 重复:重复步骤2和3,直到找到目标元素或 `start` 大于 `end`(即不存在该元素)。
二、二分查找的特点
1. 时间复杂度
O(log n),每次查找都将搜索范围缩小一半,非常高效。
2. 空间复杂度
迭代实现:O(1)(使用常量空间)。
递归实现:O(log n)(由于递归栈的使用)。
3. 条件
前提是待查找的数组必须为“有序数组”。
三、二分查找的实现
def binary_search_1(alist, item):
'''方法一:递归实现二分查找'''
# 列表长度
n = len(alist)
# 递归结束条件
if n == 0:
return False
# 中间索引
mid = n // 2
# 查找数值
if alist[mid] == item:
return True
elif alist[mid] < item:
# 数值大于中间值,目标值在右半部分
return binary_search_1(alist[mid + 1:], item)
elif alist[mid] > item:
# 数值小于中间值,中间值在左半部分
return binary_search_1(alist[0:mid], item)
def binary_search_2(alist, item):
'''方法二:迭代实现二分查找'''
start = 0
end = len(alist) - 1
while start <= end:
# 计算中间索引
mid = (start + end) // 2
if alist[mid] == item:
# 查找到目标值,返回True
return True
elif alist[mid] < item:
# 数值大于中间值,目标值在右半部分
start = mid+1
elif alist[mid] > item:
# 数值小于中间值,中间值在左半部分
end = mid-1
return False
if __name__ == '__main__':
alist = [1, 2, 3, 4, 5, 67, 99]
# result = binary_search_1(alist, 99)
result = binary_search_2(alist,2)
print('数值是否存在:',result)
四、总结
二分查找是一种极其高效的查找算法,特别适用于大规模数据集的查找场景。由于其O(log n)的效率,在许多实际应用中都非常受欢迎。