时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。
空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。
常用的时间复杂度
从上往下越来越复杂
常数阶 O(1)
无论多少代码,只有没有循环等结构,复杂度均为O(1)。1
2
3
4
5let i = 1
let j = 2
++i
j++
let m = i + j对数阶 O(logN),log以2为底
索引每次循环*2,即使log2(n)次
二分查找也是一个典型的对数阶复杂度,每查找一次就排除一半,n个数据只需要查找log2(n)次1
2
3for (let i = 0; i < len; i++) {
i = i * 2
}线性阶 O(n)
简单一层循环,执行n遍,复杂度为O(n)1
2
3for(let i = 0; i < n; i++){
// ...
}线性对数阶 O(n * logN)
外面一层循环,连一层二分循环1
2
3
4
5for(let i = 0; i < n; i++){
for(let j = 0; j < m; j++){
j = j * 2
}
}平方阶 O(n^2)
简单两层循环,执行n^2遍,复杂度为O(n^2)1
2
3
4
5for(let i = 0; i < n; i++){
for(let j = 0; j < m; j++){
// ...
}
}立方阶 O(n^3)
同上k次方阶 O(n^k)
同上指数阶 O(2^n)
略
常用的空间复杂度
待补充…