1. 程式人生 > 其它 >【資料結構】——查詢演算法:順序查詢、二分查詢

【資料結構】——查詢演算法:順序查詢、二分查詢

技術標籤:資料結構二分查詢python資料結構

一、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)最好即第一個元素就是目標元素,或第一個元素大於要查詢的元素,列表中不存在目標元素

  最壞:O(n)最壞是查到最後一個才找到目標元素或目標元素大於列表中最後一個元素,列表中不存在目標元素

三、二分查詢

  假設列表是有序升序列表:

  1. 取出列表中間位置的元素與目標元素比較,若相等,則查詢成功
  2. 若中間元素大於目標元素,則取出中間元素之前的所有元素作為前子列表,在前子列表中進行查詢;
  3. 若中間元素小於目標元素,則取出中間元素之後的所有元素作為後子列表,在後子列表中進行查詢。
  4. 如此重複,直到查詢到目標元素,則查詢成功,若直到子列表不存在仍沒有找到目標元素,則查詢不成功。
#二分查詢
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)


在這裡插入圖片描述