どうやって実装しますか?
あ、ちなみにこれ割と有名なやつなんで、アルゴリズムが好きな人なら大抵知ってるネタです。インターフェース
まず関数のインターフェースを決めましょう。変数を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 件のコメント:
コメントを投稿