引用一下百度关于霍纳规则的解释
对于这个一元多次多项式的朴素多项式求值来讲,算法复杂度应该近似于1+2+3+4+……+n=1/2*n*(n-1),即O(n^2)的复杂度。
然而使用霍纳规则,算法复杂度近似为1+1+1+1+……+1=n,即O(n)的复杂度。
换而言之,霍纳规则是个证明算法是个很有用的这件事的有力证据。
下面给出我写的递归实现的霍纳规则和普通的解法
#include <iostream>
using namespace std;
//霍纳规则
int HornerRule(int *a,int i,int n,int x)
{
if(i==n-1)
return a[n-1];
else
return a[i]+x*HornerRule(a,i+1,n,x);
}
//一般算法
int Normal(int *a,int n,int x)
{
int sum=0,i=0,j=0;
for(i=0;i<n;i++)
{
int t=1;
for(j=0;j<i;j++)
{
t*=x;
}
sum+=a[j]*t;
}
return sum;
}
int main()
{
int n[]={0,1,2,3,4,5,6,7,8,9};
cout<<HornerRule(n,0,10,2)<<endl;
cout<<Normal(n,10,2)<<endl;
}
我在写的时候想验证自己算法的解是正确的,但是似乎网上的数据比较少,我就给出几组用于大家验证
霍纳规则的若干解:
n=10,k=2,sum=8194
n=20,k=2,sum=18874370
n=10,k=3,sum=250959
n=15,k=3,sum=96855123
这个玩意真的很容易越界,很容易搞得很大,小心