普通多项式
一般地,一元n次多项式的求值需要经过(n+1)*n/2次乘法和n次加法
double f1 (int n, double a[], double x)
{
int i;
double p = a[0];
for ( i=1; i<=n; i++ )
p +=(a[i] * pow(x, i));
return p;
}
时间复杂度为O( n 2 n^2 n2)
秦九韶算法
秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法。秦九韶算法计算多项式时只需要n次乘法和n次加法。
即每次将x提出,先计算最里面的再逐层计算。
double f2 (int n, double a[], double x)
{
int i;
double p = a[n];
for ( i=n; i>0; i-- )
p = a[i-1] +x*p;
return p;
}
时间复杂度为O( n n n)
完整测试代码
#include <stdio.h>
#include <time.h>
#include <math.h>
#define MAXN 10000
clock_t start,stop;
double duration;
double f1 (int n, double a[], double x)
{
int i;
double p = a[0];
for ( i=1; i<=n; i++ )
p +=(a[i] * pow(x, i));
return p;
}
double f2 (int n, double a[], double x)
{
int i;
double p = a[n];
for ( i=n; i>0; i-- )
p = a[i-1] +x*p;
return p;
}
int main()
{
int i;
double a[MAXN];
start = clock();
for( i=0; i<MAXN;i++ )
f1(MAXN-1,a,1.1);
stop = clock();
duration = ((double)(stop - start))/CLK_TCK/MAXN;
printf("ticket1 = %f\n",(double)(stop - start));
printf("duration1 = %6.2e\n",duration);
start = clock();
for( i=0; i<MAXN;i++ )
f2(MAXN-1,a,1.1);
stop = clock();
duration = ((double)(stop - start))/CLK_TCK/MAXN;
printf("ticket2 = %f\n",(double)(stop - start));
printf("duration2 = %6.2e\n",duration);
return 0;
}