二分查詢(Python實現)
阿新 • • 發佈:2018-12-14
二分查詢
二分查詢也稱折半查詢(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)