关于Chebyshev多项式函数代码实现问题

加个缓存就会提速一大截。就是把算过的T(n,x)记录下来,算过就没必要再算一次。
■网友
如果用递归实现,时间复杂度为 关于Chebyshev多项式函数代码实现问题
,其中 关于Chebyshev多项式函数代码实现问题
为Fibonacci数列的第 关于Chebyshev多项式函数代码实现问题
项。由于Fibonacci数列呈指数级增长,该算法运行效率极其低下。同时由于递归深度为 关于Chebyshev多项式函数代码实现问题
,当输入的 关于Chebyshev多项式函数代码实现问题
太大会栈溢出。
如果用循环实现,时间复杂度为 关于Chebyshev多项式函数代码实现问题
。然而,如果使用ArrayList存储,空间复杂度也是 关于Chebyshev多项式函数代码实现问题
,当 关于Chebyshev多项式函数代码实现问题
太大时内存无法接受。由于在递推中 关于Chebyshev多项式函数代码实现问题
只和 关于Chebyshev多项式函数代码实现问题
关于Chebyshev多项式函数代码实现问题
有关,可以只存储这两个值以将空间复杂度优化到 【关于Chebyshev多项式函数代码实现问题】 关于Chebyshev多项式函数代码实现问题

double T0 = 1.0, T1 = x, T;for(int i = 2; i \u0026lt;= m; i++) {\t// T0 is T(x) and T1 is T(x)\tT = 2*x*T1 - T0;\tT0 = T1; T1 = T;}这样就可以尝试计算 关于Chebyshev多项式函数代码实现问题
这样的 关于Chebyshev多项式函数代码实现问题
相对较大的数据。
另外可以用另一种实现方式:注意到关于Chebyshev多项式函数代码实现问题
,因此 关于Chebyshev多项式函数代码实现问题
,只需计算矩阵 关于Chebyshev多项式函数代码实现问题
关于Chebyshev多项式函数代码实现问题
次幂即可解决此问题。这一过程可以用递归实现,因为 关于Chebyshev多项式函数代码实现问题
,所以下面的过程calc可以求出 关于Chebyshev多项式函数代码实现问题
(假设已定义矩阵类mat,E为单位矩阵,重载运算符*为矩阵乘法):
mat calc(int m) {\tif(m == 0) return E;\telse if(m % 2 == 1) return A * calc(m-1);\telse{\t\tmat B = calc(m/2);\t\treturn B * B;\t}}该递归函数每递归两次一定有一次使 关于Chebyshev多项式函数代码实现问题
减半,所以时间复杂度和空间复杂度均为 关于Chebyshev多项式函数代码实现问题
,运行效率很高。可以将递归改成循环将空间优化到


推荐阅读