复发关系

时间:2012-09-02 07:12:26

标签: algorithm dynamic recursion

如何计算最大复杂度的非常大的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。

2 个答案:

答案 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)

您可以简单地覆盖不再需要的元素,并将它们视为新数字。

%运营商是您的朋友。