規則就像剛才說的一樣,現在開始猜數字,假設待猜數字為57,讓我們先用之前的猜法試一下,乙個乙個猜,從1開始,這樣猜的話,最少得猜57次,6要是99的話,得猜99次,現在讓我們試一下從中間開始的猜法。從50開始,則猜數過程如下:
50---->小了、75---->大了、63---->大了、57---->猜對了
從以上過程可以看出,從中間查詢,要比乙個乙個按順序查詢快很多,隨著資料規模的增大,這種差異會越來越明顯。(感興趣的話可以自己試一下吧!)下面讓我們熱烈歡迎今天的主角,二分查詢演算法。
猜數字的時候,有個隱含的前提,它給出了乙個猜的範圍,我們也發現這些序列是連續的,其實從中間開始猜數字就蘊含了二分查詢的思想,或者說它就是通過二分查詢來實現的,每次排除一半錯誤的答案,來逼近正確答案,跟學過的對數函式一樣
分析之前得了解時間複雜度、空間複雜度及大o表示法,這幾個概念,在此假設大家都熟悉這幾個知識點(我差不多都忘完了),在此先給出一些常見的大o執行時間(由快到慢排布):
# -*- coding: utf-8 -*-
defbinary_search
(list
, item)
: low =
0# 查詢範圍下限
high =
len(
list)-
1# 查詢範圍上限
# print(high)
while
(low <= high)
: mid =
(low + high)//2
# 下標需為整數
guess =
list
[mid]
# 從中間得到所猜的數
# print(guess)
if(guess == item)
:# 剛好猜準
return
(mid)
# 跳出並返回下標
elif
(guess < item)
:# 猜的數字小了,則小於中間數的那一半均小於所猜數
low = mid+
1else
:# # 猜的數字大了,則大於中間數的那一半均大於所猜數
high = mid -
1return
(none
)# 測試用例
sea_num =
int(
input
("請輸入乙個0-10的測試數字,查詢不到則返回none:"))
list1 =[2
,4,5
,6,9
,10]print
(binary_search(list1, sea_num))
執行結果如下:
猜數字遊戲,二分查詢 ,輸密碼遊戲
1.完成猜數字遊戲 首先這個 要先理解他如何猜數字。不可能是在 中寫乙個數,你來猜它吧。所以你得有乙個可以產生隨機數的函式。也就是rand 所以接下來就好寫了。只要通過迴圈比較來告訴它值低了 還是 高了 我是通過函式來實現的,乙個輸出函式,乙個遊戲函式。結合起來。define crt secure ...
二分查詢 折半查詢 和猜數字小遊戲
一 二分查詢 1 二分查詢的思想 前提 二分查詢的序列一定是按照公升序或降序排列,不然無法使用。定義left指向第乙個元素,right指向最後乙個元素,mid指向中間元素 mid left right left 1 定義size sizeof arr sizeof arr 0 可以求得陣列的整個長度...
二分查詢演算法(折半查詢)猜數字
二分查詢演算法是建立在有序陣列基礎上的 在未接觸到二分查詢演算法時,我們對陣列進行遍歷,每個元素進行比較,即順序查詢。二分查詢較順序查詢更優,因為這種演算法每一次比較都使查詢範圍縮小一半。演算法思想為 查詢過程從陣列的中間元素開始,如果中間元素正好是要查詢的元素,則查詢過程結束 如果某一待查詢元素大...