多项式求和算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_21644713/article/details/46860319

作者:whj95

引言

该算法用于解决形如S(x) = a0+a1x+a2x2+a3x3+…+aixi+…+an1xn1+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+…+an1xn1+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即可

展开阅读全文

没有更多推荐了,返回首页