どうやって実装しますか?
あ、ちなみにこれ割と有名なやつなんで、アルゴリズムが好きな人なら大抵知ってるネタです。インターフェース
まず関数のインターフェースを決めましょう。変数をx、係数をai、次数をnとして
poly(x, a, n) = a0x0 + a1x1 + a2x2 + ... + anxn
を計算する関数のプロトタイプをC言語で作ってみましょう。
double poly(double x, double *a, int n);
普通の実装
まず素直に実装してみます。ループごとにxiを計算して、ai + xiを足し合わせます。double poly(double x, double *a, int n)
{
double v = 0;
for(int i = 0; i <= n; i++) {
// x^i
double xi = 1;
for(int j = 0; j < i; j++) {
xi *= x;
}
// a[i] * x^i
v += a[i] * xi;
}
return v;
}
この方法だと計算量はO(n2)です。
速い実装
例えばa0x0 + a1x1 + a2x2 を a0 + x(a1 + x(a2)) のように計算すれば、計算量はO(n)で済みます。double poly_horner(double x, double *a, int n)
{
double v = a[n--];
while(n >= 0) {
v = v * x + a[n--];
}
return v;
}
速いうえにコード量もかなり減りましたね。これはHorner法と呼ばれています。
0 件のコメント:
コメントを投稿