斐波那契复杂度计算

时间:2018-04-11 09:26:10

标签: java algorithm time-complexity complex-numbers

根据topic,斐波那契复杂度公式为1.6180339887 ^ N.

预期复杂性 F(20)= 1.6180339887 ^ 20 = 15126.99992456369

我有以下测试:

@Test
public void fibonacciTest() {
    AtomicInteger counter = new AtomicInteger();
    System.out.println("Fib number=" + fib(20, counter));
    System.out.println("Complexity=" + counter.intValue());
}


private int fib(int index, AtomicInteger counter) {
    counter.incrementAndGet();
    if (index <= 1) {
        return index;
    }
    return fib(index - 1, counter) + fib(index - 2, counter);
}

输出结果为:

  

Fib数= 6765复杂度= 21891

问题:

为什么输出与预期的复杂性不同?

1 个答案:

答案 0 :(得分:0)

不同之处在于没有Fibonacci数字,其值为0.数字以1, 1, 2, 3, 5开头。你的函数返回index,它可能为零。

private int fib(int index, AtomicInteger counter) {
    counter.incrementAndGet();
    if (index <= 2) {
        return 1;
    }
    return fib(index - 1, counter) + fib(index - 2, counter);
}

通过此设置,您将获得6765*2-1,这与θ(1.6^n)有点关系,因为您提到的答案是明确的。它并不意味着复杂性恰好等于1.6^n

公式为enter image description here。您可以看到n增长,第二个词变得可以忽略不计。

修改

  

我想得到正确的数学公式,我怎样才能得到它?代码很简单,因此可以在数学上计算确切的操作次数。

要回答这个问题,我们需要计算树中所有节点的数量,因为你在每个节点中递增计数器。

enter image description here

#1 + #2 = #2 + #3 = (#3 + #4) + #3 = #3 + #4 + (#4 + #5) = #3 + #4 + #5 + (#5 + #6) = ...

因此,#1 + #2等于所有内部节点的数量加1。加号来自于我们将根节点计数两次... #N + (#N + 0)。但是,#1 + #2等于Nth Fibonacci数。所以,你要求的公式是:

#op = 2 * fib(N) - 1