標籤:演算法 python 二分尋找 搜尋 遞迴
在尋找方面,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 middef 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 -1if __name__ == '__main__': l = range(50) print binarySearch1(l,10,0,49) print binarySearch2(l,10)
python標準庫中還有一個灰常給力的模組,那就是bisect。這個庫接受有序的序列,內部實現就是二分。
import bisectdef binarySearch3(lst,x): i = bisect.bisect_left(lst,x) if i != len(lst) and lst[i] == x: return i raise ValueErrorif __name__ == '__main__': lst = sorted([2,5,2,7,3]) print binarySearch3(lst,5)
python實現二分尋找及bisect模組的簡介