1. 程式人生 > >二分查詢(Python實現)

二分查詢(Python實現)

二分查詢

二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。

一、查詢過程

首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否則利用中間位置記錄將表分成前、後兩個子表,如果中間位置記錄的關鍵字大於查詢關鍵字,則進一步查詢前一子表,否則進一步查詢後一子表。重複以上過程,直到找到滿足條件的記錄,使查詢成功,或直到子表不存在為止,此時查詢不成功。

二、演算法要求

2.必須按關鍵字大小有序排列。

三、比較次數

計算公式:

當順序表有n個關鍵字時:

查詢失敗時,至少比較a次關鍵字;查詢成功時,最多比較關鍵字次數是b。

注意:a,b,n均為正整數。

四、演算法複雜度

二分查詢的基本思想是將n個元素分成大致相等的兩部分,取a[n/2]與x做比較,如果x=a[n/2],則找到x,演算法中止;如果x<a[n/2],則只要在陣列a的左半部分繼續搜尋x,如果x>a[n/2],則只要在陣列a的右半部搜尋x.

時間複雜度無非就是while迴圈的次數!

總共有n個元素,

漸漸跟下去就是n,n/2,n/4,....n/2^k(接下來操作元素的剩餘個數),其中k就是迴圈的次數

由於你n/2^k取整後>=1

即令n/2^k=1

可得k=log2n,(是以2為底,n的對數)

所以時間複雜度可以表示O(h)=O(log2n)

python實現:

"""二分查詢"""
def bin_Sea(data_list, val):
    low = 0                         # 最小數下標
    high = len(data_list) - 1       # 最大數下標
    while low <= high:
        mid = (low + high) // 2     # 中間數下標
        if data_list[mid] == val:   # 如果中間數下標等於val, 返回
            return mid
        elif data_list[mid] > val:  # 如果val在中間數左邊, 移動high下標
            high = mid - 1
        else:                       # 如果val在中間數右邊, 移動low下標
            low = mid + 1
    return # val不存在, 返回None
ret = bin_Sea(list(range(1, 10)), 3)
print(ret)