在查找方面,python中有list.index()的方法。
<span style="font-size:14px;">>>> a=[2,4,1,9,3] #list可以是无序,也可以是有序 >>> a.index(4) #找到后返回该值在list中的位置 1</span>这是python中基本的查找方法,虽然简单,但是,如果由于其时间复杂度为O(n),对于大规模的查询恐怕是不足以胜任的。二分查找就是一种替代方法。
二分查找的对象是:有序数组。这点特别需要注意。
算法基本步骤:
1.从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
2.如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
3.如果在某一步骤数组为空,则代表找不到。
这种搜索算法每一次比较都使搜索范围缩小一半。时间复杂度:O(logn)
下面有两种实现方法,一种是用递归,另一种是是用while循环控制。
def binarySearch1(lst,value,low,high):
if high < low:
return -1
mid = (low+high)/2
if lst[mid]>value:
return binarySearch1(lst,value,low,mid-1)
elif lst[mid]<value:
return binarySearch1(lst,value,mid+1,high)
else:
return mid
def binarySearch2(lst,value):
low,high = 0,len(lst)-1
while low<=high:
mid = (low+high)/2
if lst[mid]<value:
low = mid + 1
elif value<lst[mid]:
high = mid - 1
else:
return mid
return -1
if __name__ == '__main__':
l = range(50)
print binarySearch1(l,10,0,49)
print binarySearch2(l,10)
import bisect
def binarySearch3(lst,x):
i = bisect.bisect_left(lst,x)
if i != len(lst) and lst[i] == x:
return i
raise ValueError
if __name__ == '__main__':
lst = sorted([2,5,2,7,3])
print binarySearch3(lst,5)
原文地址:http://blog.csdn.net/djd1234567/article/details/45676829