目录
一、二分法基本思想
二分法是一个非常高效的算法,它常常用于计算机的查找过程中。
先玩一个小游戏。预先给定一个小于100的正整数x,让你猜,猜测过程中给予大小判断的提示,问你怎样快速地猜出来?
这样猜测最快,先猜50,如果猜对了,结束;如果猜大了,往小的方向猜,再猜25;如果猜小了,往大的方向猜,再猜75;…,每猜测1次就去掉一半的数,就这样可以逐步逼近预先给定的数字。这种思想就是二分法。
二、二分法适用情况
- 该数组,必须是有序:
- 二分查找依赖的是顺序表结构,即数组。
- 二分查找针对的是有序数据,因此只能用在插入、删除操作不频繁,一次排序多次查找的场景中。
- 对数据量大小有要求。
- 数据量太小不适合二分查找,与直接遍历相比效率提升不明显。但有一个例外,就是数据之间的比较操作非常费时,比如数组中存储的都是组成长度超过100的字符串。
- 数据量太大也不适合用二分查找,因为数组需要连续的空间,若数据量太大,往往找不到存储如此大规模数据的连续内存空间。
- 一般要求找到的是某一个值或一个位置。
三、代码示例
#判断301在不在l列表中(l列表是有序列表)
l = [1,2,3,4,7,8, 11, 34,65,76,301,887,888,55454,777777]
#运用递归来进行二分法查找
def dichotomy(l,num):
print(l)
max_index = len(l)//2
if num >l[max_index] :
dichotomy(l[max_index+1:], num)
elif num < l[max_index]:
dichotomy(l[0:max_index], num)
else:
print('In the list')
dichotomy(l,301)
#案例二,更直观。
def ErFenFa(array,key):
print ('列表长度为:',len(array)) #先计算列表的长度
mid = int((len(array)-1)/2)
print ('列表中间位数下标为:',mid)
min = 0
max = len(array)-1
print ('即将开始判断,初始化最小数下标为0,最大数下标为:%s'%max)
print ('-'*10)
count = 0
while True:
center = int((min + max) / 2)
print ('本次查找的位置:', center)
if array[center] > key:
#这种说明查找到的数字大于我们要找的数字
max = center - 1
elif array[center] < key:
#这种说明查找到的数字小于我们要找的数字
min = center + 1
print(min)
elif array[center] == key:
return ('找到了,在数组的第%s个位置'%center)
if __name__ == '__main__':
print (ErFenFa([1,2,3,34,56,57,78,87],87))
来源:CSDN
作者:金鞍少年
链接:https://blog.csdn.net/weixin_42444693/article/details/104196222