您的位置:首页 > 其它

多项式求和算法

2015-07-13 11:24 204 查看
作者:whj95

引言

该算法用于解决形如S(x) = a0+a1x+a2x2+a3x3
4000
+…+aixi+…+an−1xn−1+anxn
的多项式的和。

算法一:暴力破解

  根据多项式的直观表示方法运用累加“+=”及幂函数“pow(x,i)”进行直接表达:

  核心思想:

循环体
{
S(x) += 下标为i的系数 * x的i次方;
}


  C++参考代码如下:

double polynomialsum(int n;double a[];double x)
{
double S= 0;
for(int i = 0; i <= n; i++)//注意是n不是n-1
S += a[i] * pow(x,i);
return S;
}


  优点:这种算法比较直观而且直接,容易想到。

  缺点:太直接以致时间复杂度T(n) = O(xn),为多项式时间,显然数据大了无法接受。

算法二:类递归思想

  将多项式进行巧妙的化简,每一步都提出x并分离。

  于是该多项式算法可以从内往外循环,我们可以看到每一个完整括号内都可以看成“系数+x * S之前括号内部总和

S(x) = a0+a1x+a2x2+a3x3+…+aixi+…+an−1xn−1+anxn = a0+x(a1+x(a2+x(…+x(an))))

  核心思想:

循环体
{
S = 逆序系数 + x * S;
}


  C++参考代码如下:

double polynomialsum(int n;double a[];double x)
{
double S = 0;
for(int i = n; i >= 0; i--)//注意是n不是n-1
S = a[i] + x * S;
}


  优点:有效降低了算法复杂度T(n) = O(n),由算法一的多项式时间降为线性时间。

  缺点:创造这个想法时候最难,想到了就没什么缺点了。

  注:以上两种也可针对非连续指数的多项式使用,可将缺省项看作0*xi,所以不论是暴力还是提取法都能使用,只不过要将缺省项的系数全部置为0即可
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: