多項式求值與秦九韶算法
一、引言
多項式函數常常用於描述現實世界的各種規律,而在用計算機計算多項式的值的時候,不同算法的計算時空復雜度通常不一樣。如一個n次多項式
f(x)=a[n]x^n+a[n-1]x^(n-1)+......+a[1]x+a[0],我們的常規計算辦法是,直接計算,這樣我們的時間復雜度為:O(n^2)
下面我們介紹秦九韶算法:
其核心思想:后面每一次計算都依賴於前面計算的結果,這樣以減少重復的計算。
簡單引例:
計算 x^8 直接算將算8次乘法,而這8次都是必要的嗎?顯然不是,當我們知道x^2的值后,計算x^4只需要用x^2*x^2即可。秦九韶算法正是這樣來減少計算量的。
一、推導
a0--->an依次是最高項,到常數項系數
從而bn就是所求的解
三、算法描述
由以上推導知,bn就是我們所求的值,要求bn就得逆推到b0,由於b0=a0我們就可以求出b1依次下去就可以求出bn。
數據結構:
1.數組
1.a[]用於保存系數
ps:一般做法還需要保存b[],我們這里只是用到前一項,所以一個常數即可
c++實現:
#include <iostream> using namespace std; inline double calculate(double x, double* a, int n) /* x:f(x)中的x。a是系數數組 */ { double b = a[0]; for (int i = 1 ; i <= n; i++) { b = b * x + a[i]; } return b; } int main(int argc, char const *argv[]) { double x = 0; int n = 0; cout << "最高項冪:"; cin >> n; double* a = new double[n+1]; cout << "\n請輸入個項系數(系數為0輸入0):"; for (int i = 0; i <= n; i++) { cin >> *(a + i); } cout<<"\n要計算的x:"; cin>>x; double res = calculate(x, a, n); cout << res << endl; return 0; }