根据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
问题:
为什么输出与预期的复杂性不同?
答案 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
。
修改强>
我想得到正确的数学公式,我怎样才能得到它?代码很简单,因此可以在数学上计算确切的操作次数。
要回答这个问题,我们需要计算树中所有节点的数量,因为你在每个节点中递增计数器。
#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