このリニアサーチの計算量のオーダーを考えよう.単純なリニアサーチのプログラムは, 教科書のList 2-1(p.37)に示されているとおりで,同じものをプリントのリスト 1に載せてある.このプログラムで,もっとも多く実行される,すなわ ちもっとも多くの時間がかかる命令は,リスト1の13行目
n<num&&a[n]!=x
リスト1 リニアサーチ
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 #define NOT_FOUND (-1)
6 #define N (10)
7
8 int linear_search(int x,int *a,int num)
9 {
10 int n=0;
11
12 /* 配列の範囲内で目的の値を探す */
13 while(n<num&&a[n]!=x)
14 n++;
15
16 if(n<num)
17 return n;
18
19 return NOT_FOUND;
20 }
21
22 int main(void)
23 {
24 int i,r,array[N];
25
26 srand((unsigned int)time(NULL));
27
28 /* 適当な配列を作る */
29 printf("array ");
30 for(i=0;i<N;i++)
31 printf("[%d]:%d ",i,array[i]=rand()%20);
32
33 printf("\n何を探しますか:");
34 scanf("%d",&i);
35
36 r=linear_search(i,array,N);
37
38 if(r==NOT_FOUND)
39 printf("%dは見つかりません\n",i);
40 else
41 printf("%dは%d番目です\n",i,r);
42
43 return EXIT_SUCCESS;
44 }
このようにすると,比較の数が半分になる.しかし,計算量のオーダーは
と変わら
ないことに注意しよう.
リスト2 番兵を使ったリニアサーチ
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <time.h>
4
5 #define NOT_FOUND (-1)
6 #define N (10)
7
8 int search(int x,int *a,int num)
9 {
10 int n=0,t;
11
12 /* 最後の値をxに入れ替える(番兵) */
13 t=a[num-1];
14 a[num-1]=x;
15
16 /*目的の値を探す*/
17 while(a[n]!=x)
18 n++;
19
20 a[num-1]=t; /* 配列最後の値を元に戻す */
21 if(n<num-1)
22 return n; /* いちばん最後以外で一致 */
23 if(x==t)
24 return n; /* いちばん最後が一致 */
25
26 return NOT_FOUND;
27 }
28
29 int main(void)
30 {
31 int i,r,array[N];
32
33 srand((unsigned int)time(NULL));
34
35 /* 適当な配列を作る */
36 printf("array ");
37 for(i=0;i<N;i++)
38 printf("[%d]:%d ",i,array[i]=rand()%20);
39
40 printf("\n何を探しますか:");
41 scanf("%d",&i);
42
43 r=search(i,array,N);
44 if(r==NOT_FOUND)
45 printf("%dは見つかりません\n",i);
46 else
47 printf("%dは%d番目です\n",i,r);
48
49 return EXIT_SUCCESS;
50 }
[転載について]
このページ中のリスト1とリスト2のプロ
グラムは,教科書として使用している以下の書籍
| 書名 | プログラミングの宝箱 アルゴリズムとデータ構造 ISBN4-7973-2419-8 |
| 著作者 | 紀平拓男・春日伸弥 |
| 出版社 | ソフトバンク パブリッシング株式会社 |