「二分法」查詢的場景可以想象做一群小孩上體育課的時候按高矮個排隊,按個子從矮到高順序排好了之後, 小孩a姍姍來遲,這時候老師就說,「來,報個數,你們班排在中間的同學m舉下手」,然後小孩a和小孩m比身高,要是小孩a比m高,那小孩a的位置上肯定要安排在m之後,否則就安排在m之前。就這樣縮小範圍後,在重複上面的操作,直到小孩a找到了個他同樣高的小孩b,這就是小孩a的位置了。當然,小孩a要是站進隊裡,那就是「插入」操作了。
當然,這樣講並不是下定義,而是理解一下這個場景。
當然是乙個有序的佇列啦~畢竟只***佇列有序,我們才能毫無顧忌的「對半切」。
(1)最優o(1) 第一次比較就找到了
(2)最壞o(log n) 假設n個數的數列,每次把數列分成兩半, 所以就是以2為底n的對數。
(1)遞迴法
def
binary_search
(target_list, item)
:"""
遞迴實現二分法查詢
:param target_list: 待查詢列表
:param item: 帶查詢元素
:return:
"""# 沒找到出口
ifnot target_list:
return
false
mid =
len(target_list)//2
# mid是target_list列表中間值的下標
# 找到了出口
if target_list[mid]
== item:
return
true
# 如果target_list[mid]比item大,說明item可能會出現在target_list[mid]左邊,對左邊再查詢
elif target_list[mid]
> item:
return binary_search(target_list[
:mid]
, item)
# target_list[mid]比item小,說明item有可能在target_list[mid]右邊,對右邊再查詢
else
:return binary_search(target_list[mid +1:
], item)
if __name__ ==
'__main__'
:# 注意,如果不是有序列表,要先用sort()函式或者sorted函式排序
target_list1=[1
,2,3
,4,5
,6,7
,9,10
]print
(binary_search(target_list1,0)
)# false
print
(binary_search(target_list1,1)
)# true
(2)迴圈實現
def
binary_search
(target_list, item)
:"""
迴圈實現二分法查詢
:param target_list: 目標列表
:param item: 待查詢物件
:return:
"""# 獲取target_list列表的的開始字元和結束字元對應的下標
start =
0 end =
len(target_list)-1
# 只要start和end 還沒相等或者錯開,就一直找
while start <= end:
# 通過計算獲取當前查詢範圍的中間位置
mid =
(start + end)//2
# 如果中間數就是item則返回true
if target_list[mid]
== item:
return
true
# 如果target_list[mid]比item大,說明item可能會出現在mid左邊,對左邊再查詢
elif target_list[mid]
> item:
end = mid -
1# target_list[mid]比item小,說明item有可能在target_list[mid]右邊,對右邊再查詢
else
: start = mid +
1# 跳出迴圈說明沒找到 返回錯誤
return
false
if __name__ ==
'__main__'
: target_list1 =[1
,2,3
,4,5
,6,7
,8]print
(binary_search(target_list1,8)
)# true
print
(binary_search(target_list1,0)
)# false
1.實際上兩種方法,思路一致,所以時間複雜度是一樣的。
2.遞迴的方式,每次都要開新的列表,實際上空間複雜度會更大一些。
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...
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 ...
遞迴二分法查詢
二分法使用了折半查詢的思想,不斷的變化,陣列下標的起始位置 begin 和終止位置 end 來進行搜尋。我們使用兩種演算法,解決二分查詢 public class solution system.out.println solution.sort number,0,number.length,56 ...