1. 程式人生 > >演算法圖解——二分查詢法

演算法圖解——二分查詢法

     題記——在最近的研究中深感演算法和資料結構知識的不足,溫故而知新,特此開貼,算是複習以前的知識。本文是對《演算法圖解》一書的學習筆記,作為自己的知識積累,歡迎各位讀者共同學習。轉載請註明文章出處。

分割線~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     演算法是一組完成任務的指令,本文研究的二分查詢,是這樣一種查詢演算法:

     二分查詢的輸入是一個有序的元素列表(注意要有序),如果要查詢的元素包含在列表中,二分查詢返回其位置,否則返回null。

      這個意思很簡單,想想小時候做過的猜數字遊戲,給十個數,0到9,抽一個數字讓小朋友猜,如果比中間數小,則數字肯定在0到9的前一半,反之則在後一半,然後不停的猜下去,肯定能找到答案。這就是二分查詢法。與之對比的,是簡單查詢法,就是從0開始猜對不對,匹配上了就是對的。這種方法最壞的情況是要猜10次。所以,書中形象的稱其為傻找法

     使用二分查詢的優點是,每次都可以將餘下的數字排除一半,這樣大大提高了查詢效率,用大O表示法,其演算法複雜度為logn(底數是2),簡單查詢是n。

     所以,程式碼實現就是這樣的:

#二分法查詢演算法
def binary_search(list, item):    #二分查詢函式,引數是兩個,分別是一個列表和一個數
    low = 0
    high = len(list)-1

    while low <= high:            #列表的範圍至少包含一個元素
        mid = int((low + high)/2) #只檢查中間的元素,序號應為整數型
        guess = list[mid]
        if guess == item :        #當猜測的數字正好是給出的數字時,就找到了
            return mid
        elif guess > item :       #猜測的數字大於給出的數字時
            high = mid - 1
        else:                     #猜測的數字小於給出的數字時
            low = mid + 1
    return None                   #列表中沒有給出的數字,就返回None

if __name__== '__main__':

    my_list = [1,3,5,7,9]
    print(binary_search(my_list,3))
    print(binary_search(my_list,-1))

結果是:

1 None

總結:二分查詢算是非常簡單的演算法了,簡潔明瞭。《演算法圖解》中關於這一段程式碼的編寫有些錯誤,本文已經改正,並且使用python3進行編寫,方便初學者對照原書進行學習。如果有更好的優化想法,歡迎交流。