比較実験
比較実験
あるプログラムの性能を評価しただけでは、そのプログラムがよいプログラムかどう かはわからない。「よい」とは「よりよい」という意味であり、相対的な評価である。
あるプログラムがよいとは別のプログラムと比較してよりよいということしか言えない 。 このような明確な結論を得るためには2つの実験対象を比較する必要がある。このよう な実験を比較実験という。
実験1 プログラムの比較
元のプログラム(付録A)と改良されたプログラム(付録B)を比較せよ。プログラム の文面だけでなく実行時間も比較すること。
傾向分析
1つのプログラムを測定するだけでは点をプロットしただけだが、2つのプログラム を測定すると点を2つに増やすことができる。2つの点は線となる。すなわち変化の傾 向を知ることができる。さらに3つ、4つと点を増やすにしたがって変化はより明確に なってくる。これは科学的方法の帰納的推論である。
あるプログラムがパラメータに応じて異なる振る舞いをする場合、パラメータを連続 して変化させると振る舞いの変化を明確にすることができる。
比較実験を行うときには、比較したい項目だけを変化させる。一度に複数の項目を変化 させると変化の原因を特定することができなくなってしまう。
実験2 Nに対する実行時間の変化
サンプルプログラム(付録C)のパラメータNを変化させ、実行時間の変化を調べよ。
また、対数グラフを作成し、その傾向について考察せよ。
本日の内容をレポートR3として提出せよ。このレポートはすぐに採点せず、次回の実 験で使用する。
付録A 元のプログラム
#include <stdio.h>
void main() { int x, a, b, c, d;
scanf("%d", &x);
for(a=0; a<=x; a=a+1)
for(b=a; b<=x; b=b+1) for(c=b; c<=x; c=c+1)
for(d=c; d<=x; d=d+1) if (a*a+b*b+c*c+d*d == x)
printf("%d^2+%d^2+%d^2+%d^2=%d\n",a, b, c, d, x);
}
付録B 改良されたプログラム
#include <stdio.h>
void main() { int x, a, b, c, d;
scanf("%d", &x);
for(a=0; a*a<=x; a=a+1)
for(b=a; a*a+b*b<=x; b=b+1)
for(c=b; a*a+b*b+c*c<=x; c=c+1)
for(d=c; a*a+b*b+c*c+d*d<=x; d=d+1) if (a*a+b*b+c*c+d*d == x)
printf("%d^2+%d^2+%d^2+%d^2=%d\n",a, b, c, d, x);
}
付録C 素数のプログラム
#include <stdio.h>
#define N 10000
void main() {
int n, k, f, c = 0;
for(n=2; n<=N; n=n+1) { f = 1;
for(k=2; k*k<=n; k=k+1) { if (n % k == 0) {
f = 0;
break;
}
} if (f) {
c = c + 1;
} }
printf("%d\n", c);
}