查找算法:二分查找法(折半查找)


二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。但是,折半查找要求線性表必須采用順序存儲結構,而且表中元素按關鍵字有序排列。

 

猜數字游戲

大家都應該玩過猜數字的游戲吧?

給定一個數字的范圍 1-100 隨機抽取一個數字,然后玩家輪流猜數字,猜錯時告訴玩家結果數字是大於猜測數字還是小於.

 

那么,該怎么猜數字最快得出答案呢?當然就是二分查找了:

 

二分查找猜數字

每次猜數字,都按照范圍的一半進行猜測,例如

1-100范圍,隨機抽取55這個數字

折半查找猜50,大於50,那么這個數字的范圍就縮小到了50-100,

繼續猜測75,小於75,那么范圍就縮小成了50-75,

繼續猜測63,小於63,范圍縮小到了50-63

.

.

.

.

 

這樣下去,原本100個數字,最多只需要log2n 次即可查出數據

100的數據,只需要最多8次即可查出

 

 

php代碼實現

隨機抽取 1-100 的一個數字,猜測這個數字是多少?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
 
//隨機抽取1-100數字
$randNum  = mt_rand(0,100);
echo  "實際值為:{$randNum}\n" ;
 
function  guess( $randNum , $minNum , $maxNum , $guessNum =1){
     //二分查找,除以2
     $num  intval (( $maxNum - $minNum )/2);
     //中間值不能直接比較,需要再加上最小值,例如50-100,(100-50)/2等於25,中間值是50+25等於75
     $guessValue  $num  + $minNum ;
     echo  "猜測第{$guessNum}次:{$guessValue}\n" ;
     if  ( $guessValue == $randNum ){
         return  $randNum ;
     } elseif  ( $guessValue > $randNum ){
         //猜測值大於實際值
         return  guess( $randNum , $minNum , $guessValue , $guessNum +1);
     } elseif  ( $guessValue < $randNum ){
         //猜測值小於實際值
         return  guess( $randNum , $guessValue , $maxNum , $guessNum +1);
     }
}
 
$num  = guess( $randNum ,0,100);
echo  "最終值:{$num}" ;

輸出:

仙士可博客

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM