标签:
其实求时间复杂度的方法就是找出执行得最多的语句然后判断其量级罢了,只是有时候不太容易直接看出来,所以需要用假设的方式辅助辅助
for(int i=0;i<n;i=i*3) cout<<"hehe"<<endl;
执行次数 i的值
1 3
2 3**2
3 3**3
.... ....
k 3**k
假设执行到k次的时候结束,结束条件是3**k大于等于n了,方便计算,我们取等于既是:3**k=n。k就是我们要求的时间复杂度!
由此我们可以推出,上述例子的时间复杂度为log3n。
那么有时候是递归的函数怎么解?如下例子
void f(int n){ if(n==0) return; else return f(n/3); }
执行次数 n的值(或者在此递归传入的值)
1 n
2 n/3
3 n/(3**2)
,,, ....
k n/(3**k)
当n等于0的时候结束循环,为方便计算,我们取k=0时候结束.(此处描述不太准确,意会即可)
n/(3**k)=1 我们还是可以解出时间复杂度为log3n
最后来一个稍稍难一点的:
int i=0; int s=0; while(s<n){ i++; s=s+i; }
1 1 1
2 2 1+2
3 3 1+2+3
... ... ...
k k 1+2+3+...k
1+2+3+...+k=n
(1+k)K/2=n
k=sqrt(n)
标签:
原文地址:http://blog.csdn.net/u014403897/article/details/45272617