程序复杂度

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

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

常用的时间复杂度

从上往下越来越复杂

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

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

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

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

    1
    2
    3
    4
    5
    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)

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

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

  • 指数阶 O(2^n)

常用的空间复杂度

待补充…

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