概念
时间复杂度就是算法执行时消耗的时间
表示方法
我们通常使用O表示法,T(n) = O(fn())
fn表示每行代码执行的次数之和,O表示的是正比例关系
因此我们也可以称其为算法的渐进时间复杂度
常见时间复杂度
- O(1)
- O(logN)
- O(n)
- O(nlogN)
- O(n^2)
- O(n^3)
- O(n^k)
- O(2^n)
从上到下时间复杂度依次提升
计算方法
1、O(1)
不论代码执行了多少行,只要没有循环等复杂结构,都是O(1)
int i = 1;
int j = 2;
++i;
j++;
int m = i + j;
2、O(n)
代码进行了一次循环,循环体内的代码会执行n次,因此是O(n)
for(i=1; i<=n; ++i){
j = i;
j++;
}
3、O(logN)
循环体内每次乘2,假设循环x次,循环结束,那么2^x=n,那么x = log2 ^n次,所以是对数时间
int i = 1;
while(i<n){
i = i * 2;
}
4、O(nlogN)
这个很好理解,只要把上面的线性与对数结合就可以了
for(m=1; m<n; m++){
i = 1;
while(i<n){
i = i * 2;
}
}
5、O(n^2)
一层循环执行n次,两层则为n^2次,所以双层循环就可以得到了
for(x=1; i<=n; x++){
for(i=1; i<=n; i++){
j = i;
j++;
}
}
6、O(n ^3) O(n ^k)
参考5去理解就可以了
7、O(2^n)
解释:显然运行次数,T(0) = T(1) = 1,同时 T(n) = T(n - 1) + T(n - 2) + 1,这里的 1 是其中的加法算一次执行。
显然 T(n) = T(n - 1) + T(n - 2) 是一个斐波那契数列,通过归纳证明法可以证明,当 n >= 1 时 T(n) < (5/3)^n,同时当 n > 4 时 T(n) >= (3/2)^n。
所以该方法的时间复杂度可以表示为 O((5/3)^n),简化后为 O(2^n)。
long aFunc(int n) {
if (n <= 1) {
return 1;
} else {
return aFunc(n - 1) + aFunc(n - 2);
}
}
指数阶还需要深入理解