【发布时间】:2014-03-21 15:27:13
【问题描述】:
斐波那契的时间复杂度是O(2^n) 如果我想获得 3^n 的时间复杂度怎么办?
根据我朋友的说法,斐波那契的时间复杂度是 O(2^n),这是由于以下步骤:-
return fibonacci(n-1)+fibonacci(n-2)
另外他说如果我们写的话,它会变成O(3^n):-
return fibonacci(n-1)+fibonacci(n-2)+fibonacci(n-3)
有人能说出为什么会这样吗?
据他说,这是因为我们在每一步都调用了两次斐波那契函数,这就是为什么它是 O(2^n)。如果是这样,那么以下代码的复杂度应该是 O(k^k) 但据我所知它是 O(n)
void permute(int k,int size) {
// some base case
for (i=k-1;i>=0;i--)
permute(k-1,size);
return;
}
他的逻辑在我看来是垃圾。对我来说,由于合并成本,它是 2^n。 尽管函数在每一步调用自身两次,但二叉树遍历成本也是如此。
谁能告诉我我们当中谁错了,实际逻辑是什么?
【问题讨论】:
-
算法具有复杂性。斐波那契只是一个序列。
-
是的,我知道,谢谢
-
那你应该已经意识到像“斐波那契的时间复杂度是 O(2^n)”这样的句子没有意义。你只能说“以下实现的复杂性是……”
-
下次我会处理的。现在你能回答这个问题吗?虽然问的不正确,但我想你已经明白我想问的了。
-
通过使用什么逻辑你得出 permute 是 O(n)?
标签: algorithm time-complexity fibonacci