目录
一、二分法基本思想
二、二分法适用情况
三、代码示例
一、二分法基本思想
二分法是一个非常高效的算法,它常常用于计算机的查找过程中。
先玩一个小游戏。预先给定一个小于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))