关于Chebyshev多项式函数代码实现问题
加个缓存就会提速一大截。就是把算过的T(n,x)记录下来,算过就没必要再算一次。
■网友
如果用递归实现,时间复杂度为
,其中
为Fibonacci数列的第
项。由于Fibonacci数列呈指数级增长,该算法运行效率极其低下。同时由于递归深度为
,当输入的
太大会栈溢出。
如果用循环实现,时间复杂度为
。然而,如果使用ArrayList存储,空间复杂度也是
,当
太大时内存无法接受。由于在递推中
只和
及
有关,可以只存储这两个值以将空间复杂度优化到 【关于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;}这样就可以尝试计算
这样的
相对较大的数据。
另外可以用另一种实现方式:注意到
,因此
,只需计算矩阵
的
次幂即可解决此问题。这一过程可以用递归实现,因为
,所以下面的过程calc可以求出
(假设已定义矩阵类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}}该递归函数每递归两次一定有一次使
减半,所以时间复杂度和空间复杂度均为
,运行效率很高。可以将递归改成循环将空间优化到
推荐阅读
- 过节■江苏省委省政府办公厅下发关于做好2021年元旦春节期间有关工作的通知
- |徐州市出台《关于优化创新创业生态系统 提升区域科技创新活力的实施意见》及实施细则
- 雨下|全球关于禁售燃油车只是理论上可行吗
- 关于用phpfsocket 写Post, 模拟http 报文怎样写入要传输的处理数据
- 智叔|很多家长还在整箱买:谈谈关于牛奶的17个真相警惕这些列入黑名单的“假牛奶”
- 关于微信小程序的思考:运营者该何去何从
- 关于人工智能虚拟人的一些问题
- 知乎上关于人生经验的介绍是否可能对青少年造成潜在危害
- 写下我关于做数据分析专员的困惑和各位的建议是
- 非物质文化遗产|市北文体中心一场关于“非遗”的盛会…
