1、时间复杂度
时间复杂度就是一个函数,定性描述该算法的运行时间。用大O表示7种常见的实际复杂度,比如
- O(1),常数复杂度
- O(logn),对数复杂度
- O(n),线性时间复杂度
- O(n^2),平方
- O(n^3),立方
- O(2^n),指数
- O(n!),阶乘
时间复杂度为O(1)+O(n)=O(n),n足够大,1就可以忽略不计。相加时会取增长较大的那个时间复杂度
let i = 0;
i += 1;
for(let j=0; j < n; j+= 1){
console.log(j);
}
时间复杂度为O(n)*O(n) = O(n^2)
for(let i=0; i < n; i+= 1){
for(let j=0; j < n; j+= 1){
console.log(i, j);
}
}
时间复杂为O(logn),相当于取2的多少次方为n
let i = 1;
while(i < n){
console.log(i);
i *= 2;
}
计算:1+2+3+...+n
方法一:从1到n循环累加,O(n)
let sum = 0;
for(let i=1; i<= n; i++){
sum += i;
}
方法二:求和公式sum=n(n+1)/2,O(1)
let sum = n*(n-1)/2
更复杂的情况:递归。递归是一种层层嵌套的形式,把递归的执行顺序画出这么一个树型结构,递归树
fib: 0 1, 1, 2, 3,5,8,13,21
f(n) = f(n-1) + f(n-2)
//时间复杂度为O(k^n)
function fib(n){
if(n < 2) return n;
return fib(n-1) + fib(n -2);
}
每一层展开2^n次方,还有重复的节点
2、空间复杂度
空间复杂度也是一个函数,用大O表示,比如O(1)、O(n)、O(n^2)。算法在运行过程中临时占用存储空间大小的度量。
空间复杂度为O(1)
let i = 0;
i += 1;
空间复杂度为O(n),占用n个内存单元
const list = [];
for(let i = 0; i < n; i+=1){
list.push(i);
}
空间复杂度为O(n^2),矩阵
const matrix = [];
for(let i = 0; i < n; i+=1){
matrix.push([]);
for(let j = 0; j < n; j+=1;){
matrix[i].push(j);
}
}