计算以下算法的复杂性?
我有以下代码段:
i = 1;
while (i < n + 1) {
j = 1;
while (j < n + 1) {
j = j * 2;
}
i = i + 1;
}
plz详细解释
我想知道解决问题的步骤,以便我可以解决这些问题
答案 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)
您可以按以下方式继续: