python實現各種查詢演算法
阿新 • • 發佈:2019-01-11
#二分查詢 需要列表為有序 時間複雜度O(logn) import random def binarySearch(listn,value): listn.sort() mid = len(listn) // 2 left=0 right=len(listn)-1 count=0 while(listn[left]<listn[mid]): count += 1 if value<listn[mid]: right=mid mid=(right+left)//2 elif value>listn[mid]: left=mid mid=(right+left)//2 if (value == listn[mid]): print('count:', count) # 在得到結果時迴圈檢測和前一個元素是否相等 while listn[mid - 1] == listn[mid]: mid -= 1 return mid return -1 listn=[] for _ in range(100): rd=random.randrange(10) # 如果列表裡有相同的查詢數字就會出現問題:可能會得到後面數字的索引 # 解決方案: 在得到結果時迴圈檢測和前一個元素是否相等 # if(rd!=7): # listn.append(rd) listn.append(rd) #listn.append(7) print(binarySearch(listn.copy(),7)) #系統自帶方法find() 檢測結果是否正確 listm=listn.copy() listm.sort() print('find : ',''.join([str(m) for m in listm]).find('7'))
#插值查詢 需要列表為有序 時間複雜度O(logn) import random def InsertionSearch(listn,value): listn.sort() count=0 left=0 right=len(listn)-1 #mid=low+(high-low)*(key-a[low])/(a[high]-a[low]) #mid=left +int((right - left) * (value - listn[left]) /(listn[right] - listn[left])) while(listn[left]<listn[right]): mid = left + int((right - left) * (value - listn[left]) / (listn[right] - listn[left])) count += 1 if value<listn[mid]: right=mid-1 elif value>listn[mid]: left=mid+1 if(value==listn[mid]): print('count:',count) #在得到結果時迴圈檢測和前一個元素是否相等 while listn[mid-1]==listn[mid]: mid-=1 return mid return -1 listn=[] for _ in range(100): rd=random.randrange(10) # if(rd!=7): # listn.append(rd) listn.append(rd) print(InsertionSearch(listn.copy(),7)) #系統自帶方法find() 檢測結果是否正確 listm=listn.copy() listm.sort() print('find : ',''.join([str(m) for m in listm]).find('7')) #結論: 和二分查詢一樣無法找到重複元素的第一位(插值查詢是在二分查詢演算法基礎上進行優化) #解決方案: 在得到結果時迴圈檢測和前一個元素是否相等
#順序查詢 返回index 如果無返回-1 時間複雜度O(n)
def sequentialSearch(listn,value):
for i in range(len(listn)):
if listn[i]==value:
return i
return -1
print(sequentialSearch([4,3,9,6,7,2],7))