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