四十五、时间/空间复杂度分析

算法主要内容

  • 一、时间复杂度分析
    • 1、由数据范围反推算法复杂度以及算法内容
    • 2、如何分析代码复杂度
      • (1)看循环
      • (2)看递归
      • (3)一些看似为O(n^2),但实际为O(n)
      • (4)数据结构
      • (5)搜索问题
      • (6)数学知识
      • (7)动态规划
      • (8)贪心
  • 二、空间复杂度

一、时间复杂度分析

1、由数据范围反推算法复杂度以及算法内容

四十五、时间/空间复杂度分析_第1张图片

2、如何分析代码复杂度

(1)看循环

    • 一层循环为O(N),两层循环为O(n^2)
    • 不包含输入输出所必须的循环
    • 若两个循环,不互相嵌套,分别为m与n,则为O(m+n)

(2)看递归

    • 主定理,不适用太麻烦
    • 例如快排与归并排序:
      一共logn层,每一层是O(N)的时间复杂度,则总复杂度为O(nlogn)
      四十五、时间/空间复杂度分析_第2张图片

(3)一些看似为O(n^2),但实际为O(n)

    • 即内层循环执行肯定 <=n
    • 例如:
      四十五、时间/空间复杂度分析_第3张图片

(4)数据结构

    1. 单链表: 插入一个数,删除列表头都是O(1)
    1. 栈与队列: 每次操作都是O(1)
    1. 单调栈与单调队列: 有点类似双指针,都是O(n),KMP内层也是 <=n,故为O(n)
    1. 并查集: 未加路径压缩为O(n),路径压缩为O(nlogn)
    • 若并查集使用 1)路径压缩 2)按秩合并——则可以将复杂度降到O(loglogn)
    1. 堆: 完全二叉树,高度为logn,则删除与添加操作为O(logn)
    1. 哈希表: 增删改查近似为O(1)

(5)搜索问题

    1. 算一下执行多少次就可以了
    • 例如:全排列:O(n * n!)
    1. 图的 dfs 与 bfs
    • 保证每个点只被遍历一次
    • 遍历每个点的边 =》即遍历所有边 m,O(n+m)
    • log2(10^x)≈ 3x

(6)数学知识

  • 埃氏筛法— O(nlogn)
    • 质数的倒数和:loglogn
    • 自然数的和:logn

(7)动态规划

  • 计算量 = 状态数量 * 状态转移的计算量

(8)贪心

  • 一般是 排序+循环 ,O(nlogn)

二、空间复杂度

四十五、时间/空间复杂度分析_第4张图片

你可能感兴趣的:(数据结构与算法,java,算法,数据结构)