【資料結構】——查詢演算法:順序查詢、二分查詢
阿新 • • 發佈:2020-12-22
一、in查詢
最簡單(low)的查詢演算法:for i in range(3)
二、順序查詢
1.無序列表
順序查詢的時間複雜度較高為O(n)
若要查詢的元素在列表中有多個,則在查詢到第一個後即停止
時間複雜度:
最好:O(1)最好即第一個元素就是目標元素當不存在要查詢的元素時為O(n)
最壞:O(n)最壞是查到最後一個才找到目標元素
#無序列表的順序查詢
m=[1,5,3,9,7]
def seqSearch(alist,item):
i=0
found=False
while i<len(alist) and not found:
if alist[i]==item:
found=True
else:
i+=1
return found
seqSearch(m,2)
>>False
2.有序列表
加入一個停止條件:當前列表中元素大於要查詢元素時即停止,不再繼續查詢
#有序列表的順序查詢
m=[1,3,5,7,9]
def seqSearch(alist,item):
i=0
found=False
stop=False#停止判斷器,當前列表中元素大於要查詢元素時停止
while i< len(alist) and not found and not stop:#未找到且未達到停止條件
if alist[i]==item:
found=True
else:
if alist[i]>item:
stop=True
else:
i+=1
return found
seqSearch(m,2)
>>False
時間複雜度:
最好:O(1)最好即第一個元素就是目標元素,或第一個元素大於要查詢的元素,列表中不存在目標元素
三、二分查詢
假設列表是有序升序列表:
- 取出列表中間位置的元素與目標元素比較,若相等,則查詢成功
- 若中間元素大於目標元素,則取出中間元素之前的所有元素作為前子列表,在前子列表中進行查詢;
- 若中間元素小於目標元素,則取出中間元素之後的所有元素作為後子列表,在後子列表中進行查詢。
- 如此重複,直到查詢到目標元素,則查詢成功,若直到子列表不存在仍沒有找到目標元素,則查詢不成功。
#二分查詢
m=[1,3,5,7,9]
def binarysearch(alist,item):
if len(alist)==0:#當子列表不再存在時,返回False
return False
else:
mid=len(alist)//2#取出中間元素
if alist[mid]==item:#如果目標元素=中間元素
return True
else:
if item<alist[mid]:#目標元素小於中間元素,取出前子列表進行遞迴
return binarysearch(alist[:mid],item)
else:
return binarysearch(alist[mid+1:],item)
binarysearch(m,2)
>>False
時間複雜度:
最好:O(1)
最壞:O(logn)