时间复杂度
- 一个函数,用大O表示,例如 O(1)、O(n)、O(logN)…
- 定性描述该算法的运行时间
常见的例如下面图中的集几种,大概知道复杂度哪个比较大哪个比较小就可以了:
O(1)
// 代码只会执行一次
let i = 0;
i += 1;
O(n)
// 代码执行 n 次
for (let i = 0; i < n; i += 1) {
console.log(i);
}
两个时间复杂度的计算
O(1) + O(n)
let i = 0;
i += 1;
for (let i = 0; i < n; i += 1) {
console.log(i);
}
上述 O(1) + O(n) 结果为较复杂的 O(n),因为当 n 足够大时,1是可以勿略不计的。
O(n) * O(n)
for (let i = 0; i < n; i += 1) {
for (let j = 0; j < n; j += 1) {
console.log(i, j);
}
}
上述 O(n) * O(n) 结果为 O(n^2)
O(logN)
logN 为以2为底的 log 函数,用来求2的多少次方为 N。
let i = 1;
while (i < n) {
console.log(i);
i *= 2;
}
空间复杂度
- 一个函数,用大O表示,例如 O(1)、O(n)、O(n^2)…
- 算法在运行过程中临时占用空间大小的量度
O(1)
// 只声明了单个变量,占用的内存为1
let i = 0;
i += 1;
O(n)
// 给数组添加 n 个值,相当于占用了 n 个存储单元
const list = [];
for (let i = 0; i < n; i += 1) {
list.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);
}
}