算法复杂度
时间复杂度
用来定义描述算法的运行时间
// O(1)
let i = 0
i += 1
// O(n):一层循环,如果是 O(1) + O(n) 则还是 O(n)
for(let i=0; i<n; i++) {
console.log(i)
}
// O(n^2): 等于O(n*n),也就是双层循环,自此类推:O(n^3)...
// 如果第二层循环换成j<m,那就是O(n*m)
for(let i=0; i<n; i++) {
for(let j=0; j<n; j++) {
console.log(i, j)
}
}
// 线性对数阶O(nlogN):将时间复杂度为O(logn)的代码循环N遍的话,
// 那么它的时间复杂度就是 n * O(logN),也就是了O(nlogN)。
// O(logn)
let i = 1;
while(i<n) {
i = i * 2;
}
// n * O(logN),也就是了O(nlogN)
for(let i=0; i<n; i++) {
i = 1;
while(i<n) {
i = i * 2;
}
}
空间复杂度
用来定义描述算法运行过程中临时占用的存储空间大小,占用越少,代码写得越好。
// O(1):单个变量,所以占用永远是 O(1)
let i = 0
i += 1
// O(n):声明一个数组, 添加 n 个值, 相当于占用了 n 个空间单元
const arr = []
for (let i = 0; i < n; i += 1) {
arr.push(i)
}
// O(n^2):类似一个矩阵的概念,就是二维数组的意思
const arr = []
for (let i = 0; i < n; i += 1) {
arr.push([])
for (let j = 0; j < n; j += 1) {
arr[i].push(j)
}
}