线性搜索中的“哨兵”技巧

什么是线性搜索

线性搜索的基本过程是将若干个数据从头到尾,依次逐个比对,直到找到目标数据。

例题

假设有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
)

不用哨兵的实现(php版)

$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,并且判断当前的数字是否是我们要找的数字。

使用哨兵的实现(php版)

每次都判断箱子的编号显然有些浪费,为了避免这种不必要的判断,我们添加了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;
    }
}

使用哨兵后,我们不必每次都判断箱子的编号。

你可能感兴趣的:(算法)