比较官方的关于时间复杂度的计算我们给出的解释是这样的:要计算时间复杂度等价于计算基本语句执行次数的最高次幂,并把系数去掉。一般算法中执行次数最多的那条语句就是基本语句,通常是最内层循环的循环体。而内层循环执行的顺序要遵循 for 循环的执行顺序,外层循环执行一次,内层循环要执行全部次。
但是我们实际上可以通俗一点说,要计算时间复杂度或者是最内层语句的执行次数,也就是找循环次数(我们设为t)和给定终止条件的关系,列出等式计算即可。
一般来说它有三种类型题,单层循环、双层循环和三层及以上的。
我们先来分析单层循环,解题过程如下:
1、分别列出循环次数t和变量(可为x或i或sum等等);
2、用while或for循环里的循环终止条件(<号等直接变=即可,毕竟我们算的是值)取 最高次幂,不要系数就是要求时间复杂度
单层循环的几道简单例题:
eg.1
i=1;
wile(i<=n)
i=i*2;
循环次数t | 0 | 1 | 2 | 3 | ... | t |
---|---|---|---|---|---|---|
变量i | 1 | 2 | 4 | 8 | ... | 2^t |
很明显此时i=2^t且令其等于n时,解得t=log以2为底n的对数
eg2.
i=0;
while(i*i*i<=n)
i++;
循环次数t | 0 | 1 | 2 | 3 | ... | t |
---|---|---|---|---|---|---|
变量i | 0 | 1 | 2 | 3 | ... | t |
很明显此时i=t,则t^3=n时,循环次数t也就是时间复杂度为O(三次根号下n)
eg.4
i=0,sum=0;
while(sum<n)
sum+=++i;
循环次数t | 0 | 1 | 2 | 3 | ... | t |
---|---|---|---|---|---|---|
变量i | 0 | 1 | 2 | 3 | ... | t |
sum | 0 | 1 | 3 | 6 | ... | 0+1+2+3+...t |
这道题是找sum和t关系,但是i和sum也有关系。
sum=0+1+2+3+...t=t(t+1)/2 只关注最高数量级t^2即可,令t^2=n,则时间复杂度为O(开平方n)
eg.5
sum=1;
for(i=0;sum<n;i++)
sum+=1;
循环次数 t | 0 | 1 | 2 | 3 | ... | t |
---|---|---|---|---|---|---|
变量sum | 1 | 2 | 3 | 4 | ... | t+1 |
很明显sum=t+1,令其=n,时间复杂度为O(n)