时间复杂度
理解:某块代码的执行次数随变量n的变化
常用的时间复杂度量级
- 常数阶O(1)
- 对数阶O(logN)
- 线性阶O(n)
- 线性对数阶O(nlogN)
- 平方阶O(n²)
- 立方阶O(n³)
- K次方阶O(n^k)
- 指数阶O(2^n)
常数阶O(1)
无循环等复杂结构,无论代码执行多少行,时间复杂度都是O(1)
1 | int i=0; |
对数阶O(logN)
代码执行次数=logN
1 | int i = 1; |
线性阶O(n)
1 | for(int i=0; i<=n; i++){ |
线性对数阶O(nlogN)
对数阶O(logN)基础上循环n次
1 | for(int m=1; m<n; m++){ |
平方阶O(n²)
线性阶O(n)两层循环
1 | for(int i=0; i<=n; i++){ |
立方阶O(n³)
线性阶O(n)三层循环
K次方阶O(n^k)
类推,K次方阶O(n^k) 相当于k层循环
指数阶O(2^n)
1 | public void func(int n){ |
解释: T(0)=T(1)=1, T(n)=T(n-1)+T(n-2)+1, 是一个斐波那契数列,时间复杂度为O((5/3)^n),简化后O(2^n)
斐波那契数列没具体看,网上查别人的说法
空间复杂度
理解:存储空间随变量n的变化
和时间复杂度类似,存储空间与n无关空间复杂度为O(1),线性相关空间复杂度为O(n),同理还有O(n²)、(logN)等