1. 程式人生 > >如何用Python語言實現二分查詢

如何用Python語言實現二分查詢

二分查詢:

度娘給的解釋:二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。
在對一個集合進行二分查詢之前,需要保證的是指容器中的資料是按照有序排列的,這個是硬性要求,因為要是資料不是按照順序排列,會導致我們無法有效的根據折半之後的資料比較,確定需要查詢的資料所在的究竟是哪一半區域。
舉一個比較形象的例子:假設你去酒店開房間,你到達你去的樓層之後,樓梯出來之後首先你會看到一個房間號,你會直接根據房間號的大小,確定你是需要左轉還是右轉,這個前提就是需要房間號是按照順序佈置的,要是沒有按照順序,假設一個沒有房間號碼的主題酒店,房間門上只有對應房間的裝飾主題,那估計你只能乾著急了。

程式碼實現:

def binary_search(num, list):
low = 0
high = len(list) - 1
while (low <= high):
    middle = (low + high) // 2
    if list[middle] > num:
        high = middle - 1
    elif list[middle] < num:
        low = middle + 1
    else:
        return middle


if __name__ == '__main__':
    list = [1,2,3,4,5,6,7,8]
    num = 1
    location = binary_search(num, list)
    print(location)

程式碼解釋:

1.首先定義的兩個值,目的是為了能夠獲取到查詢資料的中間項,因為資料在列表中的儲存是採用的按照索引儲存的,因此我習慣上是按照索引來定義。

2.middle值的獲取思想是取餘,或許有人會問,這個取法會不會導致資料的丟失呢?
還有一個問題是這會不會導致資料的第一個資料和最後一個數據能否取到呢?

資料查詢的過程中自然是不會導致資料丟失的,這個查詢的過程第一步是從中間項開始的 ,但是我們要如何去判定這個集合的資料的奇偶呢,一旦在執行的過程中,縮小資料範圍,索引值為奇數呢,就會導致列表按照一個浮點型別的去查詢,自然是會產生異常。

接下來是如何獲取到查詢到的資料是第一個資料呢?

我們假設我們的查詢資料是第一個資料,就是我們在這個迴圈中我們需要一直執行往小的索引上取值,因為我們在折中取值了之後,會直接有索引加減的過程,我們假設最後這個值稱為了1,此時while條件依然成立,接下來依舊會繼續取餘操作,取餘結果就是0,然後複製給middle,然後接下來進入else條件,然後輸出。

接下來解釋一個重點,為什麼在程式碼中要進行加減1操作呢?

加減操作的目的就是完成取端點值,因為取餘操作,能取到前一個索引值,但是不能每次都能取值到後面的,什麼意思呢,假設程式碼中的low和high分別是6,8.然後middle是7,然後不進行加1操作,就是low的為7,然後折中之後還是7,程式碼就進入死迴圈。