二分查找
参考书:《算法图解》
1.举例说明
假设要在字典中找一个O开头的单词,你会从中间附近开始。当然,你也可以从A开始查找。
2.二分查找定义
二分查找
是一种算法,其输入的是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找
返回其位置,否则返回null。
一般而言,对于包含n个元素的列表,用二分法查找最多需要 Log2(n)步,而简单查找最多需要n步。
例如,列表有1024个元素。你最多需要检查10个元素,因为log2(1024)=10。
3.代码演示
按照书上敲一下
def binary_search(list,item):
low = 0
high = len(list) - 1
while low <= high:
mid = (low+high)/2
#print(mid)
guess = list[mid]
if guess == item:
return mid
if guess > item:
high = mid - 1
else:
low = mid + 1
return None
my_list = [1,3,5,7,9]
print (binary_search(my_list , 3))
print (binary_search(my_list, -1))
运行出错了,如下图所示:
4.解决bug
我们把浮点数处理为整形,方法如下
- int()不会四舍五入
- round()可以四舍五入
def binary_search(list,item):
low = 0 # low和high用于跟踪要在其中查找的列表部分
high = len(list) - 1
while low <= high: # 只要范围没有缩小到只包含一个元素
mid = int((low+high)/2) # 就检查中间元素
guess = list[mid]
if guess == item: # 找到元素,返回
return mid
if guess > item: # 猜大了
high = mid - 1
else: # 猜小了
low = mid + 1
return None # 没有指定的元素
# 测试
my_list = [1,3,5,7,9]
print (binary_search(my_list , 3))
print (binary_search(my_list, -1))
运行结果如下图所示:
5.二分法查找的流程图(自绘)
我们平时作业基本都会用画流程图的形式来梳理,所以我计划以后写博客也效仿写作业的习惯,可能有不合理的地方,欢迎评论区交流!