二分查找也稱折半查找(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}"
;
|
輸出:
本文為仙士可原創文章,轉載無需和我聯系,但請注明來自仙士可博客www.php20.cn