このリニアサーチの計算量のオーダーを考えよう.単純なリニアサーチのプログラムは, 教科書の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 |
著作者 | 紀平拓男・春日伸弥 |
出版社 | ソフトバンク パブリッシング株式会社 |