了解大O表示法O(2 ^ N)

时间:2019-09-18 00:03:43

标签: algorithm time-complexity big-o

我试图理解以下用于计算斐波那契数列的递归函数如何属于符号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表示法。

3 个答案:

答案 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)