二分查找
list.index()无法应对大规模数据的查询,需要用其它方法解决,这里谈的就是二分查找
在查找方面,python中有list.index()的方法。例如:
>>> a=[2,4,1,9,3] #list可以是无序,也可以是有序 >>> a.index(4) #找到后返回该值在list中的位置 1 >>> a.index(5) #如果没有该值,则报错 Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: 5 is not in list
这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度:O(logn)
def binarySearch(lst, value,low,high): #low,high是lst的查找范围
if high < low:
return -1
mid = (low + high)/2
if lst[mid] > value:
return binarySearch(lst, value, low, mid-1)
elif lst[mid] < value:
return binarySearch(lst, value, mid+1, high)
else:
return mid
#也可以不用递归方法,而采用循环,如下:
def bsearch(l, value):
lo, hi = 0, len(l)-1
while lo <= hi:
mid = (lo + hi) / 2
if l[mid] < value:
lo = mid + 1
elif value < l[mid]:
hi = mid - 1
else:
return mid
return -1
if __name__ == '__main__':
l = range(50)
print binarySearch(l,10,0,49)
print bsearch(l,10)下面演示这个模块的一个函数
from bisect import *
def bisectSearch(lst, x):
i = bisect_left(lst, x) #bisect_left(lst,x),得到x在已经排序的lst中的位置
if i != len(lst) and lst[i] == x:
return i
raise ValueError
if __name__=="__main__":
lst = sorted([2,5,3,8])
print bisectSearch(lst,5)二分查找算法的Python实现,布布扣,bubuko.com
原文地址:http://blog.csdn.net/qiwsir/article/details/34527189