二分查詢
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 "", line 1, in valueerror: 5 is not in list
這是python中基本的查詢方法,雖然簡單,但是,如果由於其時間複雜度為o(n),對於大規模的查詢恐怕是不足以勝任的。二分查詢就是一種替代方法。
基本步驟:
從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則搜素過程結束;
如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。
如果在某一步驟陣列為空,則代表找不到。
這種搜尋演算法每一次比較都使搜尋範圍縮小一半。時間複雜度: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)
對於python,不能忽視其強大的標準庫。經查閱,發現標準庫中就有乙個模組,名為:bisect。其文件中有這樣一句話:
看官就憑藉自己的英語水平理解吧。這段話的關鍵點是在說明:
下面演示這個模組的乙個函式
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模組,贊了。
查詢演算法 二分查詢python實現
二分查詢 時間複雜度為o logn 空間複雜度為o 1 二分查詢也叫做折半查詢,是一種在有序陣列中查詢某一特定元素的查詢演算法。查詢過程從中間元素開始。如果中間元素正好是要查詢的元素,則查詢過程結束。def binary search1 arr,value binary search1 尋找與val...
二分查詢演算法python實現
二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好 其 缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的 關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功 否則利用中間位置 記錄將表分成...
python實現二分查詢演算法
二分演算法採用分而治之的思想,演算法思路比較簡單,便直接附上一端 def binarysearch ll,x length len ll height length 1ini 0 while ini height mid ini height 2findx ll mid if findx x ret...