如何计算最大复杂度的非常大的n(比如10 ^ 14)的tribonacci数。 Tribonacci数字定义为F(n)=F(n-1)+F(n-2)+F(n-3)
F0=1, F1=2, F2=4
。
或者重复定义为
F(n)=aF(n-1)+bF(n-2)+cF(n-3)
与F0=1, F1=2, F2=4
。
我想计算log(n)中的第n个项,就像第n个Fibonacci数一样。
如何生成基本矩阵以使用矩阵求幂来计算第n个 术语
以前我试图使用DP来实现它,但是因为我们不能采用这么大的数组,所以它不能正常工作。类似地,递归在这里不起作用,因为堆栈溢出的数量非常大,为10 ^ 14。
答案 0 :(得分:13)
tribonacci数的最佳渐近复杂度将使用像the one for Fibonacci numbers这样的矩阵求幂方法。具体来说,正确写入,这是O(log n)整数运算,而不是O(n)(如动态编程方法)或O(3 n )(就像天真的解决方案)。
感兴趣的矩阵是
[1, 1, 1]
M = [1, 0, 0]
[0, 1, 0]
并且 n 第三个tribonacci数位于 M n 的左上角。必须计算矩阵求幂by squaring以实现log(n)复杂度。
(对于F(n+3) = a F(n+2) + b F(n+1) + c F(n)
,矩阵为:
[a, b, c]
M = [1, 0, 0]
[0, 1, 0]
,结果是{F n + 2 ,F n + 1 ,F n } = M n {F 2 ,F 1 ,F 0 },也see here。)
答案 1 :(得分:7)
动态编程解决方案不需要10 ^ 14个元素阵列。 只需3 。
请注意,每个步骤仅使用前3个元素,因此对于F(1000)
,您实际上不需要F(5)
。
您可以简单地覆盖不再需要的元素,并将它们视为新数字。
%
运营商是您的朋友。