作者:whj95
引言
该算法用于解决形如S(x) = a 0 +a 1 x+a 2 x 2 +a 3 x 3 +…+a i x i +…+a n−1 x n−1 +a n x n 的多项式的和。
算法一:暴力破解
根据多项式的直观表示方法运用累加“+=”及幂函数“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(x
n
),为多项式时间,显然数据大了无法接受。
算法二:类递归思想
将多项式进行巧妙的化简,每一步都提出x并分离。
于是该多项式算法可以从内往外循环,我们可以看到每一个完整括号内都可以看成“系数+x * S
之前括号内部总和
“
S(x) = a
0
+a
1
x+a
2
x
2
+a
3
x
3
+…+a
i
x
i
+…+a
n−1
x
n−1
+a
n
x
n
= a
0
+x(a
1
+x(a
2
+x(…+x(a
n
))))
核心思想:
循环体
{
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*x i ,所以不论是暴力还是提取法都能使用,只不过要将缺省项的系数全部置为0即可