リニアサーチ3


概要

 前回はリニアサーチという検索アルゴリズム作成として、検索対象の値を発見した時の処理を作りました(前回の記事)。今回は値を発見した時、どの配列で見つけたかと、発見できなかった時の処理を作ります。以下フローチャートでイメージを掴みましょう。

 再度リニアサーチの概要を解説します。別名全数探索とも言い、総当たりで検索します。アルゴリズムもシンプルでコードが書きやすい反面、動作が遅くなるリスクもあるアルゴリズムです。
 動作は大きく3つに分けられます。
①配列のデータを見る
②中のデータが探したいデータか判定する
③データ発見時、未発見時の処置
と分けて考えます。基本的に①②をループし、データが発見時、未発見時にそれぞれの手順を実行します。これが手順③になります。今回も1〜10の値を適当に配列に放り込み、10がどの配列にあるのか総当たりで探します。前回の①②に追加する形で以下のコードを書きます。

コード

#include <stdio.h>

#define NUM 10  //配列要素数
int arr[NUM]={5,2,8,9,1,4,10,6,3,7};
int val=10;   //探したい値

int main()
{
    for(int i=0;i<NUM;i++)
        if(arr[i]==val)    //値をみつけた場合
        {
            printf("%s%d%s%d\n","arr[",i,"]=",arr[i]);
            return 0;
        }
    printf("%s\n","Not found!");
    return 0;
}
Option Explicit

Const NUM As Integer = 10

Sub searchRenear()
    Dim arr() As Variant
    Dim val As Integer
    Dim i As Integer
    
    arr = Array(5, 2, 8, 9, 1, 4, 10, 6, 3, 7)
    val = 10 '探したい値
    
    For i = 0 To NUM
        If (arr(i) = val) Then  '値をみつけた場合
            Debug.Print ("arr(" + CStr(i) + ")=" + CStr(arr(i)))
            Exit Sub
        End If
    Next i
    Debug.Print ("Not found!")
End Sub

 上記コードを実行すると6の配列に探したい値、つまり10が格納されていることが分かります。そして次のreturn(Exit Sub)が大事で、値を見つけた為そのあとのプログラムを動かす必要が無いのでreturn(Exit Sub)で関数から抜けます。そうしないと次の発見できなかった時の処理が動いてしまいます。試しにreturn(Exit Sub)を消して動作させてみたり、valの値を変えてどのように動くかチェックしましょう。
 リニアサーチはこれで完成です。大事なのはループと条件文を合わせて使うことです。動きをしっかり理解しましょう。次回は検索アルゴリズムの2分探索について解説していきます。


コメントを残す