时间、空间复杂度计算

198 阅读2分钟

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);
    }
}

知识来源: coding.imooc.com/learn/list/…