码迷,mamicode.com
首页 > 其他好文 > 详细

二分查找

时间:2018-05-04 17:05:21      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:log   arc   基础算法   数据   while   turn   bsp   总结   lis   

二分查找是经常遇到的一种查找问题,也是最简单的算法基础,自己也在梳理学习基础算法,因此在这里总结一下。以【1,2,......,100】这个有序数组为例说明。

问题:要在这个列表中找到一个给定的数,比如50,如果找到返回ture,否则返回false

在我们学习二分查找之前,肯定有最笨的查找办法,那么很简单我挨个从1~100往上找,直到找到50返回true为止。很显然这样对我们写程序来说太笨了,要是好几万几亿的数字,计算机也累!这时候二分法就很厉害了。

二分法也就是我们平常说的折半法,因为是有序数组(二分只适合有序数组),我可以先比较50和这个数组中间数的大小,不管是大了还是小了,那么另一半的数据可以直接扔掉,不去管它,直接在剩下的这些数里面再次二分,不是很简单了吗。

代码(python):

def binary_search(list, item):
# 定义一个有序列表的两端索引号
low = 0
high = len(list) - 1

# 循环结束条件:最左端不能超过最右端
while low <= high:

mid = (low + high) // 2
midnum = list[mid]

if midnum == item:#找到元素,返回索引号
return mid

if midnum > item:
high = mid - 1

else:
low = mid + 1

return None

number_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(binary_search(number_list, 5))
print(binary_search(number_list, 17))

对于简单查找来说,如果有n个数,那么最坏的情况下需要找n次才能找到这个数,然而对二分法,每次二分完元素个数减半,最坏情况需要 log2(n)次

时间复杂度对比:

简单查找:O(n)

二分法:O(log2(n))

二分查找

标签:log   arc   基础算法   数据   while   turn   bsp   总结   lis   

原文地址:https://www.cnblogs.com/weilaiyilai-xw/p/8990984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!