1、搜索
- 搜索是在一个项目集合中找到一个特定项目的算法过程。
- 搜索通常的答案是真的或假的。
- 搜索的几种常见方法:顺序查找、二分法查找、二叉树查找、哈希查找
2、二分法查找
1)条件
- 排好序的序列上进行
- 有索引的序列上进行
即顺序表–在python中为列表
2)算法
假设查找[1,3,4,6,7,8,10,13,14]列表中是否有元素4
- 首先由于是有顺序的序列,因此先找中间值是多少,即序列长度除以2–索引为4的为中间值–7
- 得到之间值后,判断要找的值是大于还是小于中间值
- 如果大于,则再在右侧序列中找中间值
- 否则,则在左序列中找中间值–此时,7>4,因此再在左侧序列中找中间值
- 此时,索引3/2=1,索引1的值为3,3<4,因此真实值在右侧
- 右侧索引为2~3,(2+3)/2=2,索引2的值即为4
3)python实现
# 递归的二分查找
def binary_search(list,item):
n=len(list)
if n >= 1:
mid=n//2
if list[mid] == item:
return True
elif list[mid] < item:
return binary_search(list[mid+1:],item)
else:
return binary_search(list[:mid],item)
return False
# 非递归的二分查找
def binary_search_2(list,item):
n=len(list)
first=0
last=n-1
while first <= last:
mid=(first+last)//2
if list[mid]==item:
return True
elif list[mid] < item:
first=mid+1
else:
last=mid-1
return False
if __name__ == '__main__':
list=[12,22,34,45,60,64,65,74,97]
print(binary_search(list,34))
print(binary_search(list,99))
print(binary_search_2(list,34))
print(binary_search_2(list,99))
结果:
True
False
True
False
4)时间复杂度
- 最优时间复杂度:O(1)
- 最坏时间复杂度:O(logn)