4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

線形探索の番兵法を用いると何がいいのか?

Last updated at Posted at 2021-01-19

線形探索について

線形探索は先頭から順番に探す値が見つかるまで探していくアルゴリズム
名称未設定.png

まずは上記の図をそのままプログラムにしてみます。


#include <stdio.h>
int main(void){
    int n = 6;
    int a[6] = {5, 2, 1, 8, 6, 3};
    int i;
    int search = 8;
    printf("検索対象 = %d\n", search);
    
    for (i = 0; i < n; i++) {
        printf("%d\n", a[i]);
        if (a[i] == search) {
            puts("見つかりました");
            return 0;
        }
    }
    
    puts("見つかりませんでした");
    return 0;
}

出力結果

terminal
5
2
1
8
見つかりました

番兵法

配列の末尾に探したい値を入れておき、必ず条件式がTrueになるようにすることです。
名称未設定 (1).png

上記の図をそのままプログラムにしてみます。


#include <stdio.h>
int main(void){
    int n = 6;
    int a[7] = {5, 2, 1, 8, 6, 3};
    int i = 0;
    int search = 9;
    printf("検索対象 = %d\n", search);
    
    a[n] = search;
    while (a[i] != search) {
        printf("%d\n", a[i]);
        i++;
    }
    
    if (i == n) {
        puts("見つかりませんでした");
        return 0;
    }
    
    printf("%d\n", a[i]);
    puts("見つかりました");
    return 0;
}

出力結果

terminal
検索対象 = 9
5
2
1
8
6
3
見つかりませんでした

まとめ

番兵使用することで、最後は必ず検索に引っかかるので、ループ条件と検索条件を組み合わせることができるようになります。
最初のfor文を使用した例だと、繰り返し条件i < nと検索マッチ条件a[i] == searchが必要だったのに比べ、
番兵を使用すると、a[i] != searchこの条件だけで良くなります。

よって、番兵を使用することで、条件式の実行回数が減る(CPUの計算量が減る)のでその分処理が高速になります。

※c言語始めたばかりなので、もっといい書き方ありそう。

4
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?