python 二分法查詢(遞迴實現和迴圈實現)

2021-10-09 02:14:55 字數 2545 閱讀 7253

「二分法」查詢的場景可以想象做一群小孩上體育課的時候按高矮個排隊,按個子從矮到高順序排好了之後, 小孩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 ...