无法理解嵌套循环的大O.

时间:2015-12-08 14:06:32

标签: algorithm big-o

我无法理解以下有关分析以下两种算法的问题的答案。

for (int i = n ; i >= 1; i = i/2) {
   for ( int j = 1; j <= n ; j++) {
     //do something                
   }
}

根据答案,上述算法具有O(n)的复杂度。它不应该低,因为外环总是将我们必须经过的量减半。我认为它应该是O(n / 2 *)的线条?

for ( int j = 1; j <= n ; j++ ) {
    for ( int i = n ; i >= j ; i = i / 2 ) {
       //do something 
    }
}

如果我是正确的,这个是O(n log n)吗?

1 个答案:

答案 0 :(得分:5)

第一次迭代将执行n步骤,第二次将执行n/2,第三次将执行n/4,依此类推。

如果您为n/(2^i)计算i=0..log n的总和,则大致为2n,这就是O(n)的原因。

如果您从总和中取出n并仅对1/(2^i)部分求和,则会得到2。看一个例子:

1 + 1/2 + 1/4 + 1/8 + 1/16 + ... = 1 + 0.5 + 0.25 + 0.125 + 0.0625 + ... = 2

每个下一个元素都小两倍,因此总和不会超过2

第二个嵌套循环示例是正确的 - 它是O(n log n)

修改

在来自ringø的评论后,我重新阅读了这个问题,实际上算法与我所理解的不同。 ringø是正确的,问题中描述的算法是O(n log n)。但是,从上下文来看,我认为OP意味着一种算法,其中内部循环与i而不是n相关联。

这个答案涉及以下算法:

for (int i = n ; i >= 1; i = i/2) {
   for ( int j = 1; j <= i ; j++) {
     //do something                
   }
}