简介
从
有序列表
的初始候选区ls[0:n]开始,对待查找的值与候选区中间的值比较,
使得候选区规模减半
时间复杂度
O(logn)
线性查找与二分查找的抉择
- 如果列表已经是有序的了,直接上二分
- 如果列表是乱序的,那么要考虑查找次数,
如果查找次数不频繁,就用线性,因为排序的时间复杂度 > O(n);
如果查找次数频率高,可以考虑先排序,再用二分
代码示例
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""二分查找
从有序列表的初始候选区ls[0:n]开始,对待查找的值与候选区中间的值进行比较,
使得候选区规模减半
时间复杂度:O(logn),但是排序的时间复杂度 > O(n)
问题:线性查找与二分查找的抉择
1. 如果列表已经是有序的了,直接上二分
2. 如果列表是乱序的,那么要考虑查找次数,
如果查找次数不频繁,就用线性,因为排序的时间复杂度 > O(n);
如果查找次数频率高,可以考虑先排序,再用二分
"""
def binary_search(ls, val):
"""二分查找
Args:
:param ls: seq, 用于查找的有序列表
:param val: any, 待查找的值
Returns:
1. int, 如果找到了, 返回对应的索引
2. -1, 如果找不到, 返回-1
"""
left = 0
right = len(ls) - 1
while left <= right:
mid = (left + right) // 2
if ls[mid] == val:
return mid
elif ls[mid] > val:
right = mid - 1
else:
left = mid + 1
else:
return -1
ls = range(10)
print(binary_search(ls, 11))