跳转到内容

复杂度分析

首发于:2021-02-18

学习数据结构和算法之前必须要学会复杂度分析,复杂度分析是整个算法学习的精髓,只要掌握了它,数据结构和算法的内容基本上就掌握了一半

时间复杂度分析

时间复杂度代表代码执行时间随数据规模增长的变化趋势。

7种常见时间复杂度

  • O(1) 常数时间复杂度
  • O(n) 线性时间复杂度
  • O(n²) 指数时间复杂度
  • O(log n) 对数时间复杂度
  • O(k^n) n次方时间复杂度
  • O(n log n) 线性对数时间复杂度
  • O(n!) 阶乘时间复杂度

时间复杂度比较

O(1) < O(logn) < O(n) < O(nlogn) < O(n²) < O(k^n) < O(n!)

计算方法案例

例1:计算 1 + 2 + 3 + ... + n

方法1:从1到n的循环累加

js
let sum = 0
for (let i = 1; i < n; i++) {
    sum += i
}

时间复杂度 O(n)

方法2:求和公式 sum = n(n+1)/2

js
const sum = n * (n + 1) / 2

时间复杂度 O(1)

例2:递归,求斐波拉契数列的值,Fib:0, 1, 1, 2, 3, 5, 8, 13, 21, ...

F(n) = F(n - 1) + F(n - 2)

直接使用递归,时间复杂度 O(2^n)

js
function fib(n) {
    if (n < 2) {
        return n
    }
    return fib(n - 1) + fib(n - 2)
}

主定理求递归时间复杂度:

二分查找: T(n) = T(n/2) + O(1) => O(log n)

二叉树:T(n) = 2T(n/2) + O(1) => O(n)

排好序的二维矩阵二分查找:T(n) = 2T(n/2) + O(log n) => O(n)

归并排序:T(n) = 2T(n/2) + O(n) => O(n log n)

空间复杂度分析

空间复杂度代表算法的存储空间与数据规模之间的增长关系。

我们常见的空间复杂度就是 O(1)、O(n)、O(n^2 ),像 O(logn)、O(nlogn) 这样的对数阶复杂度平时都用不到。

如果开一个数组,数组的长度就是空间复杂度,一维数组 O(n),二维数组 O(n^2)。

京ICP备18043750号