二分查詢顧名思義就是從序列的中間位置查詢,都將目標數字與序列的中間位置數字進行對比,如果目標數字等於中間位置數字則返回對應的序列索引,如果目標數字大於中間位置數字,則繼續從右側的序列中利用二分查詢,如果目標數字小於中間位置數字,則繼續從左側的序列中利用二分查詢,直到查到目標數字為止。二分法查詢的效率很高,但是也有其侷限性,比如,目標序列必須是有序的序列,查詢的目標如果在序列中有多個,只能查詢到乙個等。
這裡介紹了基礎的二分查詢演算法,並且對其進行了簡單的擴充套件,擴充套件後增加:
容錯功能,當傳參不符合要求的時候不會丟擲異常
查全功能,可以查到目標序列中全部的目標數字的位置
無序序列處理,如果序列為無序序列時,可以選擇是做普通查詢還是轉換為有序序列後做二分查詢
結果格式化,返回結果為乙個字典
下面分別以和文字形式進行(截圖由於左右限制無法在寬度上截全圖,但是下面的原始碼是全的可複製的)
1、基礎的二分查詢
說明
baselist 必須為有序的數字序列
targetnum 必須為數字
如果查詢到目標數字則返回對應的索引,如果沒查詢到則返回-1
傳參型別錯誤時會丟擲異常
原始碼
# 二分法查詢目標數字,baselist必須為有序的數字序列(列表或元組)def halfsearchtargetnum(baselist, targetnum): leftindex = 0 rightindex = len(baselist) - 1 while leftindex <= rightindex: midindex = int((leftindex + rightindex) / 2) if baselist[midindex] < targetnum: leftindex = midindex + 1 elif baselist[midindex] > targetnum: rightindex = midindex - 1 else: return midindex return -1
呼叫
if __name__ == '__main__': test = [-20, -3, 1, 3, 5, 5, 6, 7.6, 8, 56] print('結果1:', halfsearchtargetnum(test, 5)) print('結果2:', halfsearchtargetnum(test, 7.6)) print('結果3:', halfsearchtargetnum(test, 56)) print('結果4:', halfsearchtargetnum(test, -20)) print('結果5:', halfsearchtargetnum(test, 9))
呼叫結果
結果1: 4結果2: 7結果3: 9結果4: 0結果5: -1
2、二分查詢演算法擴充套件**中有詳細的注釋說明,擴充套件後增加的內容包括:
容錯功能,當傳參不符合要求的時候不會丟擲異常
查全功能,可以查到目標序列中全部的目標數字的位置
無序序列處理,如果序列為無序序列時,可以選擇是做普通查詢還是轉換為有序序列後做二分查詢
結果格式化,返回結果為乙個字典
原始碼
呼叫
if __name__ == '__main__': test1 = [5, 5.1, 5.1, 5.1, 5.11] test2 = [-20, -3, 92, 12, -2, 12, 7.6, 8, 56] test3 = 99 test4 = [-20, -3, 92, 12, -2, '12', 7.6, 8, 56] print('結果1:',halfsearchtargetnum(test1, 5.1)) print('結果2:',halfsearchtargetnum(test1, 5.1, issorted=true)) print('結果3:',halfsearchtargetnum(test2, 12, issorted=true)) print('結果4:',halfsearchtargetnum(test2, 12)) print('結果5:',halfsearchtargetnum(test2, 100)) print('結果6:',halfsearchtargetnum(test2, '12')) print('結果7:',halfsearchtargetnum(test3, 99)) print('結果8:',halfsearchtargetnum(test4, 12))
呼叫結果
結果1: 結果2: 結果3: 結果4: 結果5: 結果6: 結果7: 結果8:
python3 二分法查詢
二分法查詢 有序列表 掐頭去尾取中間 查詢列表中xx在不在列表中,在,則返回索引值 lst 1,4,6,8,9,21,23,26,35,48,49,54,67,89,99 使用in判斷,不使用二分法 n 49 for i,v in enumerate lst if v n print 找到了,索引為...
python二分法查詢 Python 二分法查詢
二分法查詢主要的作用就是查詢元素 lst 1,3,5,7,12,36,68,79 資料集 百萬級資料 num int input 請輸入你要查詢的元素資訊 for el in lst if num el print 存在 break else print 不存在 len lst 0 1 2 3 4 ...
C 二分法查詢,遞迴二分法
用二分法來求需要查詢的值.includeusing namespace std 查詢key元素是否存在 int findkey const int buf 100 const int ilen,const int key else right left mid 1 查詢失敗 return 1 查詢k...