程序复杂度

86 阅读1分钟

Date: 2022-03-01

参考:知乎 算法的时间与空间复杂度

js_complexity.png

时间维度:是指执行当前算法所消耗的时间,我们通常用「时间复杂度」来描述。 空间维度:是指执行当前算法需要占用多少内存空间,我们通常用「空间复杂度」来描述。

常用的时间复杂度

从上往下越来越复杂

  • 常数阶 O(1) 无论多少代码,只有没有循环等结构,复杂度均为O(1)。

    let i = 1
    let j = 2
    ++i
    j++
    let m = i + j
    
  • 对数阶 O(logN),log以2为底 索引每次循环*2,即使log2(n)次 二分查找也是一个典型的对数阶复杂度,每查找一次就排除一半,n个数据只需要查找log2(n)次

    for (let i = 0; i < len; i++) {
      i = i * 2
    }
    
  • 线性阶 O(n) 简单一层循环,执行n遍,复杂度为O(n)

    for(let i = 0; i < n; i++){
      // ...
    }
    
  • 线性对数阶 O(n * logN) 外面一层循环,连一层二分循环

    for(let i = 0; i < n; i++){
      for(let j = 0; j < m; j++){
        j = j * 2
      }
    }
    
  • 平方阶 O(n^2) 简单两层循环,执行n^2遍,复杂度为O(n^2)

    for(let i = 0; i < n; i++){
      for(let j = 0; j < m; j++){
        // ...
      }
    }
    
  • 立方阶 O(n^3) 同上

  • k次方阶 O(n^k) 同上

  • 指数阶 O(2^n) 略

常用的空间复杂度

待补充...

参考:知乎 算法的时间与空间复杂度