1. 时间复杂度
- 常数阶
O(1)
- 对数阶
O(logN)
- 线性阶
O(n)
- 线性对数阶
O(nlogN)
- 平方阶
O(n²)
- 立方阶
O(n³)
- K次方阶
O(n^k)
- 指数阶
(2^n)
从上而下时间复杂度越来越大,执行效率越来越低。
① 常数阶O(1)
无论代码执行了多少行,只要没有循环等复杂结构,那么这段代码的时间复杂度就是O(1)
。
② 线性阶O(n)
for(int i = 0; i<= n; i++) {
//todo
}
这段代码,for
循环里的代码将执行n
次,消耗的时间和变量n
是成正比的。因此使用O(n)
表示它的时间复杂度。
③ 对数阶O(logN)
for(int i = 1; i<n; i*=2) {
}
例如上述循环,它的终止条件是i<n
,但是增长为i*2
,那么意味着,循环< n
次就会结束循环。
我们假设循环x
次会结束,那么也就是2
的x
次方就会等于n
,也就是说:x = log2^n
。
所以它的时间复杂度为O(logN)
。
④ 线性对数阶O(NlogN)
在对数阶的基础上嵌套一个循环,终止条件为n
。
for(int i = 0; i<= n; i++) {
for(int i = 1; i<n; i*=2) {
}
}
⑤ 平方阶O(n^2)
for(int i = 0; i<= n; i++) {
for(int i = 0; i<= n; i++) {
}
}
存在两个终止条件为n
的循环。
如果变成这样:
for(int i = 0; i<= n; i++) {
for(int j = 0; j<= m; j++) {
}
}
那么它的时间复杂度为O(n * m)
。
2. 空间复杂度
① O(1)`
如果算法执行时,所需空间不会因为某个变量的增大而增大,减小而减小。那么这段代码的空间复杂度为O(1)
。
② O(n)
int[] array = new int[n];
int i = 5;
i = i *5;
n = i + n;
这段代码执行时,第一行会申请一个长度为n
的一维数组,n
越大,所需空间就越大n
。
所以它的空间复杂度为O(n)
。