时间、空间复杂度分析

724 阅读2分钟

一、空间复杂度

通过读程序的方式来判断

1.1 常见的8种时间复杂度

  1. O(1):常数复杂度
  2. O(logn):对数复杂度
  3. O(n):线性时间复杂度
  4. O (nlogn):线性对数阶
  5. O(n^2):平方
  6. O(n^3):立方
  7. O(2^n):指数
  8. O(n!):阶乘

1.2 常见时间复杂度分析

O(logn)

for (int i = 1; i < n; i = i*2) {
    System.out.println(i);
}

O(n!)

int fib(int n) {
    if (n < 2) return n;
    return fib(n-1) + fib(n-2);
}

1.3 时间复杂度曲线

image-20230419235636257.png

  1. 养成习惯,写完之后分析这段程序的时间复杂度和空间复杂度
  2. 用最简洁的时间、空间复杂度来实现

1.4 举例

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

方法一:从1到n和循环累加

y = 0;
for i = 1 to n:
    y+=i

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

y = n * (n+1)/2

不同程序方法,结果一样,复杂度很不一样。面对一个问题的时候,1确认无误,2想所有可能解决办法,3比较方法的空间、时间复杂度,并找出最优的,4实现

1.5 更复杂的情况:递归

关心执行了多少次,把递归执行顺序画出树形结果,称之为递归树或状态树

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

image.png

1.6 主定理,计算递归函数的时间复杂度

image-20230419234858627.png

  1. 二分查找,在有序的数列中找到目标数,每次都一分为二,只查一边
  2. 二叉树遍历,每次一分为二,每一边是相等的时间复杂度这么下去,每个节点访问且仅访问一次
  3. 排好序的二维矩阵中进行二分查找,
  4. 归并排序,nlog(n)

1.7 思考题

  1. 二叉树遍历 - 前序、中序、后序:时间复杂度是多少
  2. 图上的遍历:时间复杂度是多少
  3. 搜索算法:DFS、BFS时间复杂度是多少
  4. 二分查找:时间复杂度是多少

O(n)、O(n)、O(n)、O(logn)

二、空间复杂度

2.1 两条原则

  1. 数组长度
  2. 递归的深度(特殊说明)