我试图理解以下用于计算斐波那契数列的递归函数如何属于符号O(2 ^ N)。
apply plugin: 'com.android.application'
dependencies {
implementation project(':my-lib')
implementation 'com.android.support:appcompat-v7:27.1.1'
}
repositories {
flatDir {
dirs 'libs'
}
}
例如,如果我们考虑找到数字“ 5”的斐波那契数列,则会调用fibo方法15次。我们如何说它属于O(2 ^ N)表示法?
int fibo(int num)
{
if (num <= 1) return num;
return fibonacci(num - 2) + fibonacci(num - 1);
}
我知道我的问题很琐碎。请视我为新手,尝试学习Big-O表示法。
答案 0 :(得分:2)
Big Oh为您提供算法运行时的上限。那是, 您必须阅读O(2 ^ n)中的fib(n),以表明您的算法最多执行2 ^ n个步骤才能返回结果。有时,上限不是那么精确(情况就是如此)。您还可以说fib在O(n!)中,这是另一个上限(一个非常糟糕的上限)。
要说明算法的精确运行时间,您必须使用Theta表示法,在这种情况下,fib是Theta(Phi ^ n),其中Phi是黄金分割率。您可以通过归纳法来证明这一点。
答案 1 :(得分:0)
Big-O表示法并不是要计算实际的操作次数/时间量/内存量。这是为了模拟当N向无穷大增长时这些数量的总体增长率或形状。请注意,常数因子与Big-O没有关系-3 x O(2 ^ N)和100 x O(2 ^ N)之间没有差异。这根本不是数字。
在缩放的性能情况下,15x和16x之间的差异是没有意义的,而对于足够大的N,N ^ 2和N ^ 2.1之间的差异是巨大的。
答案 2 :(得分:0)