まず、プロファイルを作成する必要があります。私たちが話しているのは、最大で500 * 100=50,000の操作だけです。あなたがそれを非常に非効率的にコーディングしない限り、平均的な現代のコンピュータはそれを10分の1秒未満で終えることができます。
とにかくそれを最適化したいと仮定して、マスター配列をソートし、ランダム化された配列の各要素に対してバイナリ検索を実行する必要があります。これにより、500個の数値の二分探索には最大9回の比較が必要になるため、操作の数が50,000から最大900に減少します。
これは、標準Cライブラリの組み込みのソートおよびバイナリ検索関数(qsort
および)を使用する実装です。bsearch
int less_int(const void* left, const void* right) {
return *((const int*)left) - *((const int*)right);
}
int main(void) {
size_t num_elements = 500;
int* a = malloc(num_elements*sizeof(int));
for(size_t i=0 ; i<num_elements ; i++) {
a[i] = rand() % num_elements;
}
qsort(a, num_elements, sizeof(int), less_int);
size_t num_rand = 100;
int* r = malloc(num_rand*sizeof(int));
for(size_t i=0 ; i < num_rand ; i++) {
r[i] = rand() % num_rand;
}
for (size_t i = 0 ; i != num_rand ; i++) {
int *p = (int*) bsearch (&r[i], a, num_elements, sizeof(int), less_int);
if (p) {
printf ("%d is in the array.\n", *p);
} else {
printf ("%d is not in the array.\n", r[i]);
}
}
free(a);
free(r);
return 0;
}
ideoneで実行中のこのプログラムへのリンクは次のとおりです。