用于评估给定度数的多项式和已知系数(按顺序)的最快已知算法是什么? 我尝试按以下方式进行:
long long int evaluatepoly(long long int* coeffa0,long long int degree,long long int x)
{
/*coeffa0 is the coeffecient array in order x^0,x^1,x^2....degree->degree of polynomial
and x is the value where the polynomial is to be evaluated*/
if(degree==1)
{
return (coeffa0[0] + (coeffa0[1])*x);
}
else if(degree==0)
return coeffa0[0];
else{
long long int odd,even,n=degree;
if(degree%2==0){
odd=(n/2);
even=(n/2)+1;
}
else{
odd=(n+1)/2;
even=(n+1)/2;
}
long long int oddcoeff[odd],evencoeff[even];
int i=0;
while(i<=degree)
{
if(i%2==0)
evencoeff[i/2]=coeffa0[i];
else
oddcoeff[i/2]=coeffa0[i];
i++;
}
int y=x*x;
return (evaluatepoly(evencoeff,(even-1),y) + x*(evaluatepoly(oddcoeff,(odd-1),y)));
}
}
我是初学者,所以也欢迎提出改进上述代码的建议(在C / C ++中)。
答案 0 :(得分:1)
您的评估具有递归复杂性
T(2n)=2*T(n)+2
如果只计算乘法,加上构造子阵列的一些开销,导致整体T(n)= 2n-2次乘法(n次幂为2)。
(错名)Horner方法使用n-1次乘法。
答案 1 :(得分:0)
评估多项式的一种非常简单,相对快速的方法是使用每个项增加指数的事实:
int polynomial(int* coefs, int deg, int x) {
int factor = 1, result = 0;
for(int term = 0; term <= deg; term++) {
result += coefs[term] * factor;
factor *= x;
}
return result;
}
上述代码在多项式的次数上具有线性时间复杂度。考虑这个伪代码,我还没有编译它。希望它有所帮助!
Faster方法存在,但更复杂。