计算以下算法的复杂性?

时间:2014-08-19 16:08:49

标签: c++ algorithm time-complexity

计算以下算法的复杂性?

我有以下代码段:

i = 1;
while (i < n + 1) {
    j = 1;
    while (j < n + 1) {
        j = j * 2;
    }
    i = i + 1;
} 

plz详细解释

我想知道解决问题的步骤,以便我可以解决这些问题

5 个答案:

答案 0 :(得分:8)

由于j呈指数增长,内循环需要O(log(n))

由于i线性增长,外部循环需要O(n)

因此整体复杂性为O(n*log(n))

答案 1 :(得分:4)

i = 1;
while(i < n + 1){
    j = 1;
    While(j < n + 1){
        j = j * 2:
    }

    i = i + 1;
} 

外循环取O(n),因为它以常数递增。

i = 1;
while(i < n + 1){

    i = i + 1;
} 

内环:j = 1,2,4,8,16,......,2 ^ k
j = 2 ^ k(k> = 0) j何时停止?
当j == n,
时 log(2 ^ k)= log(n)
=&GT; k * lg(2)= lg(n).....所以k = lg(n)。

While(j < n + 1){

        j = j * 2;
}

总O(n * lg(n))

答案 2 :(得分:2)

这个类似于以下代码:

for( int i = 1;i < n+1 ; i++){ // this loop runs n times
    for(int j = 1 ; j<n+1 ; j=j*2){// this loop runs log_2(n)(log base 2 because it grows exponentially with 2)
      //body
    }
} 

因此,在Big-Oh表示法中,它是O(n)* O(logn);即,O(n * logn)

答案 3 :(得分:1)

您可以简单地理解外循环(使用i),因为它完全循环n次。 (1,2,3,...,n)。但内循环(j)有点难以理解。

我们假设n是8.它循环多少?从j = 1开始,它将以指数方式增加:1,2,4,8。当j超过8时,循环将终止。它完全循环4次。然后我们可以考虑这个问题的一般形式......

想想序列1,2,4,8 ......如果n是2 ^ k(k是非负整数),内循环将花费k+1次。 (因为2 ^(loop-1)= 2 ^ k)由于假设:n = 2^k,我们可以说k = lg(n)。所以我们可以说内循环需要lg(n)+1次。

如果n不完全适合2 ^ k,则需要一次。 ([lg(n)]+1)虽然它具有楼层功能,但它并不是很复杂。你这次可以搞定它。

因此总费用如下:n*(lg(n)+1)。如果您熟悉Big-O表示法,则可以表示为:O(n lg n)

答案 4 :(得分:0)

您可以按以下方式继续:

enter image description here