了解如何计算代码片段的Big-O

时间:2017-03-13 01:27:23

标签: big-o asymptotic-complexity

我理解简单的陈述,如:

int x = 5; // is 1 or O(1)

和while循环如:

while(i<); // is n+1 or O(n)

与单个for循环相同(取决于)。 使用嵌套的while或for循环,例如:

for(int i = 0; i<n; i++){ // this is n + 1
for(int j = 0; j<n; j++){ // this is (n+1)*n, total = O(n^2)
}

此外,只要我们有双倍效果,它就是log_2(n),三倍效果log_3(n)等等。如果控制变量被减半或被分成几乎也是log_2(n)或log_4(n)。

但我正在处理更复杂的例子。如何看待这些例子。我有答案我只是不知道如何在纸上进行考试。

例1:

for (i = 1; i < (n*n+3*n+17) / 4 ; i += 1)
System.out.println("Sunshine");

例2:

for (i = 0; i < n; i++) 
if ( i % 2 == 0) // very confused by what mod would do to runtime
for (j = 0; j < n; j++) 
System.out.print("Bacon");
else
for (j = 0; j < n * n; j++) 
System.out.println("Ocean");

示例3:

for (i = 1; i <= 10000 * n: i *= 2)
x += 1;

谢谢

1 个答案:

答案 0 :(得分:1)

示例1受术语O(n^2)限制,因此应为O(n^2)。这是n^2的原因是因为表达式中最大且占主导地位的术语是i

第二个例子有点棘手。 n中的外循环将迭代i次,但内部执行的内容取决于n的值是奇数还是偶数。偶数时,发生n^2上的另一个循环,但是当奇数O(n^3)中的循环发生时。奇怪的情况最终将主导运行时间,因此示例2应为10000*n

第三个示例迭代直到命中i,但是通过在每一步加倍循环计数器O(lgn)来实现。这将具有lg性能,其中n=32表示日志库2.为了了解原因,想象一下我们想要i=1,从lg(32)开始,每次加倍。好吧,我们将有2,4,8,16和32,即6步,增长为{{1}}。