20 資料結構 二分法查詢(筆記)

2021-10-06 15:38:05 字數 1733 閱讀 6852

搜尋是在乙個專案集合中找到乙個特定專案的演算法過程。搜尋通常的答案是真的或假的,因為該專案是否存在。 搜尋的幾種常見方法:順序查詢、二分法查詢、二叉樹查詢、雜湊查詢。

二分查詢又稱折半查詢,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。首先,假設表中元素是按公升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

二分法只查詢順序表,讀取元素時間複雜度為o(1)的有序序列。像鍊錶就不可以,因為二分法查詢元素,主要是為了避免遍歷序列中的所有元素來達到查詢元素的目的,而鍊錶本身找到對半位置的元素都是要通過遍歷找到的(鍊錶本身訪問序列中的元素時間複雜度是o(n),不是o(1)),就達不到二分法查詢的初衷。

1. 遞迴的方法實現

def binary_search(alist, item):

n = len(alist)

if 0 == n: #退出遞迴的條件

return false

mid = n // 2

if alist[mid] == item:

return true

elif item < alist[mid]:

return binary_search(alist[:mid], item)

else:

return binary_search(alist[mid+1:], item)

testlist=[0,1,2,13,15,44,53,77]

print(binary_search(testlist, 44))

print(binary_search(testlist, 20))

2. 非遞迴的方法實現

def binary_search(alist, item):

start = 0

end = len(alist) - 1

while start <= end: #當序列只有乙個元素的時候

mid = (start + end) // 2

if alist[mid] == item:

return true

elif item < alist[mid]:

end = mid - 1

else:

start = mid + 1

return false #當退出迴圈沒有返回true時說明沒有找到

testlist=[0,1,2,13,15,44,53,77]

print(binary_search(testlist, 44))

print(binary_search(testlist, 20))

最優時間複雜度就是剛好mid就是要查詢的元素,最壞時間複雜度就二分法的一直分解的次數,n為序列的長度,也就是 n/2/2/2/2… =1,也就是122*2…=n, 也就是logn.所以時間複雜度是o(logn)

資料結構 之二分法查詢

二分法查詢 二分法查詢是有一定條件的 等如下,對於二分法查詢有乙個最重要的條件就是必須是已經排好序的陣列 資料查詢成功返回序列號,否則返回 1 include int diguifa int a,int key,int low,int high int feidigui int a,int key,...

二分法查詢資料

首先你儲存的資料內容必須是有序的 其次找到中間值 然後將你想要的查詢的值進行對比 如果比他大就去右邊尋找 反之就往左邊尋找 public static void main string args scanner b newscanner system.in system.out.println 請輸...

資料結構與演算法 二分法查詢

資料結構與演算法 二分法查詢 查詢的陣列必須是有序的 可以和氣泡排序合起來用 使用二分法查詢能提高查詢效率 每次查詢砍掉一半的資料量,2 n 資料量,n就是二分法查詢的次數 普通二分法查詢,返回索引 lst 0 1,2 3,4 5,6 7,8 9,10 11,12 13,14 15,16 17,18...