資料結構30 二分查詢及演算法分析

2021-10-09 17:38:35 字數 1814 閱讀 4159

目錄

一、二分查詢

二、二分查詢**

三、二分查詢:分而治之

四、演算法分析

前面介紹了順序查詢,但是對於有序表,有沒有更好更快的查詢演算法呢?

在順序查詢中,如果第乙個資料項比匹配查詢項的話,那麼最對還有n-1個待比對的資料項。那麼是否可以利用有序表的特性,迅速縮小待比對資料項的範圍呢?

我們從列表的中間開始比對!

列表中間的項比查詢項大,那麼查詢項就只可能出現在前半部分;

列表中間的項比查詢項小,那麼查詢項就只可能出現在列表的後半部分。

無論如何,我們都會將比對的範圍縮小到原來的一半: n/2

繼續上面的查詢,每次都會將比對範圍縮小一半。

def binarysearch(alist, item):

first = 0

last = len(alist) - 1

found = false

while first <= last and not found:

midpoint = (first + last) // 2

if alist[midpoint] == item:

found = true

else:

if alist[midpoint] > item:

last = midpoint-1

else:

first = midpoint + 1

return found

二分查詢實際上體現了解決問題的典型策略:分而治之

將問題分為若干更小規模的部分,通過解決每乙個小規模部分問題,並將結果彙總得到原問題的解。

顯然,遞迴演算法是一種典型的分治策略演算法,二分法也適合用遞迴演算法來實現。

當比對次數足夠多以後,比對範圍內就會僅剩餘乙個資料項,無論這個資料項是否匹配查詢項,比對最終都會結束,解方程i=log2(n):

所以二分查詢的的演算法複雜度是o(logn)

但是在本演算法中,除了比對,還有乙個因素需要考慮到:

這個遞迴中,使用了列表的切片操作,而切片操作的複雜度是o(k),這樣會使演算法的複雜度稍稍增加。

當然,我們採用切片是為了使程式的可讀性更好,實際上也可以不切片,而只傳入起始和結束的索引值即可,這樣就不會有切片的時間開銷了。

資料結構 二分查詢演算法

1.請自行學習二分查詢演算法,並實現以下函式 1.1 在乙個已排序的整型陣列array中,假設已知array陣列的元素個數為n,需要查詢的關鍵值為key,要求在array陣列中查詢值為key的數字,並返回該數字在陣列中對應的索引值。請設計並實現該函式。include int bsearch1 int...

資料結構 二分查詢(演算法)

二分查詢要求陣列必須有序,如果陣列無序,需對陣列進行排序操作 首先確定陣列中間值的下標 mid left right 2 讓需要查詢的值findvalue與arr mid 進行比較 1 如果無它要求,直接返回mid即可 2 如果需要查詢第乙個元素位置,需要向左迴圈,查詢mid前面是否還有滿足需求的值...

資料結構查詢演算法(二分查詢)

參考例子 後記 二分查詢演算法,說白了就是在有序的陣列裡面給予乙個存在陣列裡面的值key,然後將其先和陣列中間的比較,如果key大於中間值,進行下一次mid後面的比較,直到找到相等的,就可以得到它的位置。首先確定整個查詢區間的中間位置mid strat end strat 2 用待查關鍵字key值與...