int sum=0;
for(int i =1;i<n;i*=2)
for(int j=0;j<i;j++)
sum++;
问怎么求这个代码的时间复杂度。
对于以往的题目来说,直接看最大循环的次数就好,但是外层循环和内层循环的次数不是固定的,那么我们需要根据循环内部的判定条件来判定时间复杂度。
对于外层循环可能的情况为:1 2 4 8 … … 2i2^i2i 并且 2i2^i2i<n<=2i+12^{i+1}2i+1
然后对于内部循环的情况比较清楚,是直接加了外层循环的次数即i
那么总的时间复杂度为 1+2+4+…+2i2^i2i=2i+1−12^{i+1}-12i+1−1(代入二进制数算也可以得到)
且对于上式2i2^i2i<n<=2i+12^{i+1}2i+1 我们可以得到
(总时间)T>=n-1且
T<=2n-1
那么总的时间复杂度为O(n) 。
再换一个例子
int i =1;
while(i<=n)
i=i*2;
对于这个代码,设操作的次数为t,那么每操作一个i的值都会乘2,那么i的值为2t2^t2t,
且2t2^t2t<=n,那么t<=log2n\log_2nlog2n,那么总的时间复杂度为O(log2n\log_2nlog2n).

1264

被折叠的 条评论
为什么被折叠?



