目錄
一、二分查詢
二、二分查詢**
三、二分查詢:分而治之
四、演算法分析
前面介紹了順序查詢,但是對於有序表,有沒有更好更快的查詢演算法呢?
在順序查詢中,如果第乙個資料項比匹配查詢項的話,那麼最對還有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值與...