线性搜索的基本过程是将若干个数据从头到尾,依次逐个比对,直到找到目标数据。
假设有50个箱子,里面分别装有一个写有任意数字的纸条,箱子上面标有1~50的序号。现在要从这50个箱子当中查找是否有箱子装有写着要查找数字的纸条。
假设我们的数据如下,我们要查找的数字为8254
1 => 1952,2 => 4028,3 => 99,4 => 7161,5 => 6357,
6 => 9293,7 => 5017,8 => 6575,9 => 2590,10 => 2706,
11 => 5107,12 => 7203,13 => 8907,14 => 7706,15 => 2209,
16 => 671,17 => 272,18 => 1344,19 => 7099,20 => 1987,
21 => 6023,22 => 1012,23 => 8013,24 => 6103, 25 => 8069,
26 => 5694,27 => 6331,28 => 2781,29 => 6285,30 => 5223,
31 => 8812,32 => 5056,33 => 4515,34 => 3554,35 => 9074,
36 => 362,37 => 2131,38 => 8970,39 => 8783,40 => 5911,
41 => 2248,42 => 6953,43 => 6827,44 => 7359,45 => 7217,
46 => 4911,47 => 3978,48 => 9985,49 => 7970,50 => 7320
)
$num = 8254;
while(true){
if($i>50){ // 判断箱子的编号
echo 'not found';
exit;
}
if($arr[$i]!=$num){ // 判断数字
$i++;
}else{
echo 'the number '.$num.' is in the box '.$i;
exit;
}
}
如果不使用哨兵,我们不得不每次判断箱子的编号是否大于50,并且判断当前的数字是否是我们要找的数字。
每次都判断箱子的编号显然有些浪费,为了避免这种不必要的判断,我们添加了51号箱子,把要找的数字放到里面,这种数据我们称之为“哨兵”。
$num = 8254;
$guard = 51;
$arr[$guard] = $num;
while(true){
if($arr[$i]!=$num){
$i++;
}else{
if($i!=$guard){
echo 'the number '.$num.' is in the box '.$i;
}else{
echo 'not found';
}
exit;
}
}
使用哨兵后,我们不必每次都判断箱子的编号。