您的位置:首页 > 其它

算法入门1:二分查找

2017-09-05 19:39 239 查看
一、何为二分查找

二分查找,是计算机科学中较为基础的算法,又称二分法,其主要应用于在一个有序的元素列表中查找某个元素(为什么要有序请继续往下看)。

二、工作原理

假设你在玩一个猜数的游戏,其范围是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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: