【アルゴリズム】線形探索

線形探索とは

配列の先頭から、各要素の値が目的の値と等しいかどうかを、順番に調べること。
目的の値が見つかった時点で、その位置(key)を返す。
最後まで見つからなかった場合には、その事を示す値を返す(NOT_FOUND)。
※以下、phpの場合

線形探索(位置を返す)

function linear_search($array,$target){
    for($i=0;$i<count($array);$i++){//0 < i < n-1
        if($array[$i]==$target){//a[i] == key
            return $i;//位置を返す
        }
    }
    return "NOT_FOUND";
}
$array=[1,4,5,6,7,8,2];
$a = linear_search($array,8);
$b = linear_search($array,18);
var_dump($a);//int(5)
var_dump($b);//string(9) "NOT_FOUND"

番兵を用いた場合(位置を返す)

番兵とはループ制御の簡略化のために使う値で、比較演算の数が番兵を使うと異なる。
番兵を使わない場合には、keyと比較演算の2つを使用しているが、番兵を使うと、不等価演算1つで済む。

function linear_search($array,$target){
    $i = 0;
    $n = count($array);
    $array[$n] = $target;
    
    while($array[$i] != $target)$i++;
    if($i == $n){
     return "NOT_FOUND";   
    }
    return $i;
}
$array=[1,4,5,6,7,8,2];
$a = linear_search($array,8);
$b = linear_search($array,18);
var_dump($a);//int(5)
var_dump($b);//string(9) "NOT_FOUND"

boolで見ると違いが見えやすい。

線形探索(bool)

function linear_search($array,$target){
    for($i=0;$i<count($array);$i++){
        if($array[$i]==$target){
            return true;
        }
    }
    return false;
}

番兵を用いた場合(bool)

function linear_search($array,$target){
    $i = 0;
    $n = count($array);
    $array[$n] = $target;
    
    while($array[$i] != $target)$i++;    
    return $i != $n;
}

以上。

参照

『プログラミングコンテスト攻略のためのアルゴリズムとデータ構造』(渡部有隆(著)、2020)