一、何为二分查找
二分查找,是计算机科学中较为基础的算法,又称二分法,其主要应用于在一个有序的元素列表中查找某个元素(为什么要有序请继续往下看)。
二、工作原理
假设你在玩一个猜数的游戏,其范围是1~100,每当你提出一个数,就会有人告诉你猜大了还是猜小了。
如果你从1开始逐渐往100猜,那么如果答案是80,你就得猜测80次,答案是n,你就得猜测n次,我将这种方法称为简单查找。
但是如果你使用二分查找(答案依然是80),你就可以先折半,先猜50,这样就能一次排除小于50的前一半的数字,然后把51~100继续折半,依次猜75,87(85~90之间),81(75~87之间)。。。每次二分,以此类推,最后得到80(开心)。
100每次除以2,向上取整分别商50,25,13,7,4,2,1,可见要在100中查找到一个数,用二分法最多只需要7步。
三、运行效率(简单查找VS二分查找)
包含100个元素的列表,简单查找最多需要100步,二分查找只需要7步;
包含4 000 000 000个元素的列表,简单查找最多需要4 000 000 000步,二分查找只需要32步;
包含n个元素的列表,简单查找最多需要n步,二分查找只需要log2(n)步,也就是每二分一次就除以2,n除尽需要log2(n)次。
四、代码示例
def binary_search(list, item):
'''数组第一个元素的索引为0,最后一个元素的索引为数组长度len-1'''
low = 0
high = len(list) - 1
while low <= high:
'''如果二分以后中间的元素的值自动向下取整'''
mid = (low + high) / 2
guess = list[mid]
if guess == item:
return mid
if guess < item:
low = mid + 1
else:
high = mid - 1
return None
'''测试'''
my_list = [1,3,5,7,9]
print binary_search(my_list, 3) #return 1
print binary_search(my_list, -1)#return None