Algorithm 确定大o形While循环

Algorithm 确定大o形While循环,algorithm,while-loop,big-o,Algorithm,While Loop,Big O,//n>0 i ← 0 while (i < n) j ← 0 while (j < power(2,i)) j ← j + 1 done i ← i + 1 done i← 0 而(i

//n>0

i ← 0 
while (i < n) 
     j ← 0 
     while (j < power(2,i)) 
         j ← j + 1 
     done 
    i ← i + 1 
done
i← 0
而(i
由于内部while循环有一个条件,其中2^i so 2^0 2^1 2^2…=1 2 8 16 32 64 128…等,所以总体复杂度是O(n(log(n))吗

外环看起来就是O(n)

O(n(log(n))的多个双循环复杂性,请确认?提前谢谢。

看起来像O(2^n),内循环是从i=0到i=n-1的(2^i)之和,它和2^(i)-1个操作之和

看起来像O(2^n),内循环是从i=0到i=n-1的(2^i)之和,它和2^(i)-1个操作之和

O(2^n)

对于外部循环,迭代次数为n,因此内部循环针对从0到n-1的每个i值执行。
每次内循环的迭代次数为
2^i
,因此整个程序的总迭代次数为:

2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + ... +2^(n-1)
这个总和等于
2^n-1
。因为2^n比1大,我们可以在big-O符号中去掉1,得到
O(2^n)
它是
O(2^n)

对于外部循环,迭代次数为n,因此内部循环针对从0到n-1的每个i值执行。
每次内循环的迭代次数为
2^i
,因此整个程序的总迭代次数为:

2^0 + 2^1 + 2^2 + 2^3 + 2^4 + 2^5 + ... +2^(n-1)

这个总和等于
2^n-1
。因为2^n比1大,我们可以在big-O表示法中去掉1,通过Sigma表示法使用正式的方法得出
O(2^n)

i ← 0 
while (i < n) 
    j ← 0 
    while (j < power(2,i)) 
         j ← j + 1 
    done 
    i ← i + 1 
done

通过西格玛符号使用正式方法:

i ← 0 
while (i < n) 
    j ← 0 
    while (j < power(2,i)) 
         j ← j + 1 
    done 
    i ← i + 1 
done

不。你需要重新检查内部循环。记住log(n)的增长速度比n慢。注意2^n的增长速度。1,2,4,8…还有,为什么你要跳过2^2?看起来像是O(n)和1在一起,而在外面,有幂(2,i),可能是O(logn),所以根据我的计算可能是O(n log n)?我已经有一段时间没有做过大Oh表示法了。@user3818430如果你把它倒过来了,j增加到2^I<2^n。为了澄清Ben的评论,类似于
while(power(2,j)
的东西会给出一个内部
日志I
。不。你需要重新检查内部循环。记住这个日志(n)增长速度比n慢。注意2^n的增长速度。1,2,4,8…还有,为什么要跳过2^2?看起来像O(n)和1在一起,而在外面的时候,功率(2,i),可能是O(logn),所以根据我的计算可能是O(n logn)?我已经有一段时间没有做过大的Oh表示法了。@user3818430你把它倒过来了,j增加到2^I<2^n。为了澄清Ben的评论,类似于
while(power(2,j)
将给出一个内部的
日志i
。你不应该用它乘以外部循环的复杂性。它已经被计算在总数中了。你的答案在O(n2^n)之前吗?我的意思是,从技术上讲,如果它是O(2^n),它就是O(n2^n)…:p。但是@mclov实际上,
O(n2^n)
并不等于
O(2^n)
。无论常数是什么,总有一个值n,超过该值,第一个函数将大于第二个。然而,
2^n
2^n+n
是等价的。我不是说它们是等价的,只是如果f(n)是O(2^n),f也是O(n2^n),因为你说的原因。对不起,误读了你的评论。你是对的,以
O(2^n)
为界的算法是以
O(n2^n)
为界的算法的子集。你不应该把它乘以外环的复杂度。它已经被计算在总和中了。你的答案在O(n2^n)之前吗?我的意思是,从技术上讲,如果它是O(2^n),它是O(n2^n).:p.但这是@mclov的一个好发现,实际上,
O(n2^n)
并不等同于
O(2^n)
。无论常数是什么,总有一个值n,超过该值,第一个函数将大于第二个。然而,
2^n
2^n+n
是等价的。我不是说它们是等价的,只是如果f(n)是O(2^n),f也是O(n2^n)抱歉,误读了你的评论。你是对的,受
O(2^n)
约束的算法是受
O(n2^n)
约束的算法的子集。