首先,在数学上有一个经典的搜索算法,二分查找法,即每次都猜**(最大值+最小值)/2的那个值,根据反馈的结果大小继续查找,直到找到结果。通过二分查找法,每次获得的搜索范围都比以前要减小一半,当n=1000,logn的值为10,所以最多查找次数不超过10**次,我们来检验一下!
第一步:编写一个二分查找法的小程序
import random
#guessnumber.py
#验证二分法查找法最多次数为logn
"单轮测试结果"
target = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为要被猜的数字
print("target= %d"%target)
guess = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为第一次尝试猜测的数字
count = 0# 赋猜测次数初始值为0次
max = 1000# 赋最大值初始值
min = 0# 赋最小值初始值
while True:
if guess < target:
print("guess%d= %d is smaller than target"%(count,guess))
min = guess# 猜测数字小了,将此次猜测结果赋给min,作为下次最小值
guess = (guess + max)//2
count += 1
elif guess > target:
print("guess%d= %d is bigger than target"%(count,guess))
max = guess# 猜测数字大了,将此次猜测结果赋给max,作为下次最大值
guess = (min + guess)//2
count += 1
else:
print("guess%d= %d is right!"%(count,guess))
break
print("Total number is %d"%count)
测试结果截图:
由图可见,次数为8次,确实不超过10次就查找到了准确值。
可这只是一次测试,会不会是偶然,所以要设计一个循环在多次测试中统计结果判断是否都在10次之内。
第二步:编写一个循环测试100次二分查找法的小程序
ps:为了方便我把第一步的程序封装起来,并且为了显示结果简单,删除了每次打印每次输出结果。直接输出最后成功次数。
import random
#guessnumber.py
#验证二分法查找法最多次数为logn
def binary_search():
"单轮测试结果"
target = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为要被猜的数字
# print("target= %d"%target)
guess = random.randint(1,1000)# 随机获得一个1-1000之内的整数作为第一次尝试猜测的数字
count = 0# 赋猜测次数初始值为0次
max = 1000# 赋最大值初始值
min = 0# 赋最小值初始值
while True:
if guess < target:
# print("guess%d= %d is smaller than target"%(count,guess))
min = guess# 猜测数字小了,将此次猜测结果赋给min,作为下次最小值
guess = (guess + max)//2
count += 1
elif guess > target:
# print("guess%d= %d is bigger than target"%(count,guess))
max = guess# 猜测数字大了,将此次猜测结果赋给max,作为下次最大值
guess = (min + guess)//2
count += 1
else:
# print("guess%d= %d is right!"%(count,guess))
break
# print("Total number is %d"%count)
if count <= 10:
return True# 在10次之内返回真
else:
return False# 返回假
rcount = 0# 测试成功次数初始值0
ecount = 0# 测试失败次数初始值0
for i in range(100):
if binary_search():
rcount += 1
else:
ecount += 1
print("success_number:%d,fail_number:%d"%(rcount,ecount))
测试结果:
可见测试100次全部正确,当然换成一千一万次都会成功的,这里就不演示了,这里代码还可以再封装到类里然后可以用户输入测试次数运行,然后打包成一个测试小软件的样子,有兴趣可以去尝试,这里要用到pyinstaller库打包py文件为exe文件。
一起学python的朋友可以和我这个小白一起,加关注互粉