在查找方面,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)
python标准库中还有一个灰常给力的模块,那就是bisect。这个库接受有序的序列,内部实现就是二分。
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)
时间: 2024-10-29 04:03:20