算法入门1:二分查找

一、何为二分查找

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

二、工作原理

假设你在玩一个猜数的游戏,其范围是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
    原文作者:查找算法
    原文地址: https://blog.csdn.net/daemonfg/article/details/77855275
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞