資料結構與演算法 9.順序查詢和二分法查詢
阿新 • • 發佈:2021-10-29
查詢
常見查詢演算法:順序查詢,二分法,二叉樹,雜湊
選擇查詢方法需要考慮的因素:
查詢速度
應用場景
資源佔用
資料結構相關性:討論查詢演算法的時候,首先要明確是在什麼資料結構上執行查詢演算法
不同的資料結構有不同的查詢演算法,有的資料結構就是為了查詢而生,如二叉樹、雜湊
順序查詢
遍歷序列,將序列中的元素與被查詢的資料逐一作比較
順序查詢對被檢索的序列沒有任何要求
複雜度:時間複雜度:O(n)
二分法 binarySearch
二分法只適用於已經完成排序的序列 通過把序列中間的數與被查詢的資料不斷作比較來確定被查詢的數所處的範圍 複雜度:最優時間複雜度:O(1) 最差時間複雜度:O(logn)
方法一
def binary_search1(varlist,item): # 首尾兩個位置 first = 0 last = len(varlist) - 1 # first=last時還剩最後一個值,所以還需要比較 while first <= last : # 根據首尾找到中間位置 midpoint = (first + last) // 2 if item == varlist[midpoint] : return True # 被查詢元素小於中間的數,則改變last,在左邊繼續二分 elif item < varlist[midpoint] : last = midpoint - 1 # 被查詢元素大於中間的數,則改變first,在右邊繼續二分 elif item > varlist[midpoint] : first = midpoint + 1 return False varl = [3,15,26,57,78,128,258,438] res = binary_search1(varl,57) print(res) True
方法二:遞迴
def binary_search2(varlist,item): # 結束遞迴的條件,比較完序列中所有元素 if len(varlist) == 0 : return False else: # 找到中間位置 midpoint = len(varlist) // 2 if item == varlist[midpoint] : return True # 呼叫自身來修改查詢範圍 elif item < varlist[midpoint] : return binary_search2(varlist[:midpoint],item) else : return binary_search2(varlist[midpoint+1:],item) varl = [3,15,26,57,78,128,258,438] res = binary_search2(varl,3) print(res) True