使用大整数时间复杂度的递归斐波那契

Recursive fibonacci using Big Integer time complexity

能否解释一下下面算法的复杂度?

public BigInteger fibBigInt() {
    return fibBigInt( 
               BigInteger.valueOf(n), 
               ONE, 
               BigInteger.valueOf(0));
}

private BigInteger fibBigInt(BigInteger start, BigInteger val, BigInteger previous) {
    if (start.compareTo(BigInteger.valueOf(0)) == 0) {
        return previous;
    }
    return fibBigInt( 
               start.subtract(ONE),  
               val.add(previous), 
               val);
}

如何在 O(n) 时间内递归 运行?我有点糊涂了。

Fibonacci 是不同复杂度的标准示例 类,因为根据定义,天真的方法需要 O(2^n) 时间,而线性解决方案只需要 O(n) 时间。这个适用于线性模式。

这个想法是有一个起始值(fib(0)fib(1)),并通过一次调用从 fib(n+1) 迭代计算 fib(n+2)。诀窍是不仅要存储 fib(n+1) 的结果,还要存储 fib(n) 的结果。这是通过在每个递归步骤中“旋转”fib(n+1)fib(n) 的值来完成的。

因此最好用一个例子来解释它是如何工作的 (n=5)。请注意,参数 m 是您想要的斐波那契数的输入值。 m 的值在递减,值 0 标志着递归结束。您截取的代码使用计数器 m 运行并且没有属性 n.

n m fib(n+1) fib(n) comment
0 5 1 0 first 6 lines of your code
1 4 1+0 = 1 1 iteration step, last 4 lines of your code. The current fib(n+1) is the fib(n+1)+fib(n) from the line above, fib(n) is the fib(n+1) from the line above.
2 3 1+1 = 2 1 see above
3 2 2+1 = 3 2
4 1 3+2 = 5 3
5 0 5+3 = 8 5 now the term start.compareTo(BigInteger.valueOf(0)) becomes 0 and therefore the value for fib(n) (5) will be returned and "forwarded" back through each recursive call.

这种方法显然是线性的,因此在 O(n) 中运行。