时空复杂度

算法思想代表算法时间复杂度空间复杂度关键字 / 特点
分治法二分查找O(log n)O(1) / O(log n)一分为二,减半查找
归并排序O(n log n)O(n)拆分合并,稳定排序
快速排序O(n log n) 平均 / O(n²) 最坏O(log n)枢轴划分,非稳定
堆排序O(n log n)O(1)完全二叉堆,原地排序
大整数乘法 (Karatsuba)O(n^1.585)O(n)分块相乘,比 O(n²) 快
矩阵乘法 (Strassen)O(n^2.81)O(n²)分块递归,优于 O(n³)
汉诺塔O(2^n)O(n)递归分解,移盘子
最近点对问题O(n log n)O(n)平面点集,分治+合并
棋盘覆盖问题O(n²)O(n²)缺角棋盘,分治填充
回溯法八皇后问题O(n!)O(n)解空间树,逐步试探
图的 m 着色问题O(m^n)O(n)染色合法性,DFS 枚举
Hamilton 回路O(n!)O(n)访问一笔画,回路判定
旅行商问题 (TSP)O(n!)O(n)最短环路,指数级
子集和问题O(2^n)O(n)枚举子集,判断和
数独求解指数级O(n²)搜索解空间,强剪枝
迷宫求解指数级O(n²)路径搜索,回头退栈
动态规划斐波那契数列O(n)O(n) / O(1)最优子结构,递推
最长公共子序列 (LCS)O(m·n)O(m·n)/O(min(m,n))表格法,子问题重叠
最长公共子串O(m·n)O(m·n)连续匹配,动态表格
背包问题 (0-1/完全/多重)O(n·W)O(n·W)/O(W)状态转移,容量约束
最长上升子序列 (LIS)O(n²) 或 O(n log n)O(n)子序列 DP,二分优化
矩阵链乘法O(n³)O(n²)括号化顺序,区间 DP
最优二叉搜索树O(n²)O(n²)动态选择,代价最小
Floyd-WarshallO(n³)O(n²)全源最短路,三重循环
Bellman-FordO(VE)O(V)松弛操作,可负权
编辑距离O(m·n)O(m·n)插删改,字符串匹配
贪心法活动选择O(n log n)O(1)按结束时间排序,逐次选择
最小生成树 (Kruskal)O(E log V)O(V+E)边排序 + 并查集
最小生成树 (Prim)O(E + V log V)O(V+E)顶点扩展,堆优化
哈夫曼编码O(n log n)O(n)频率最小合并,最优前缀码
分数背包O(n log n)O(1)按单位价值排序,取部分
区间调度问题O(n log n)O(1)区间选择,局部最优
单源最短路径 (Dijkstra)O(E log V)O(V+E)贪心扩展,非负权
多机调度问题O(n log n)O(1)按任务长短/机器负载分配
找零问题O(n)O(1)局部最优,贪心取币

所需时间的度量

$O(1) < O(log_2 n) < O(n) < O(nlog_2n) < O(n^2) < O(n^a) < O(2^a) $


DP

类别经典问题时间复杂度关键词/特点
基础斐波那契数列O(n)最优子结构,递推
基础切杆问题O(n²)分割切割,利润最大
序列最长公共子序列 (LCS)O(m·n)表格法,子问题重叠
序列最长公共子串O(m·n)连续匹配
序列最长上升子序列 (LIS)O(n²)/O(n log n)子序列 DP,二分优化
序列编辑距离 (202111)O(m·n)插删改匹配
序列最长回文子序列O(n²)区间DP,对称性
序列最长回文子串O(n²)子串回文
序列正则/通配符匹配O(m·n)模式匹配
背包0-1 背包O(n·W)容量约束,取或不取
背包完全背包O(n·W)物品可重复
背包多重背包O(n·W)物品数量有限
背包分组背包O(n·W)组内最多选1
背包硬币找零O(n·amount)组合/兑换问题
区间矩阵链乘法O(n³)区间DP,括号化顺序
区间石子合并 (文件合并)O(n³)合并代价最小
区间戳气球O(n³)复杂区间DP
区间最优二叉搜索树O(n²)构造最优树
路径最小路径和O(m·n)二维累加,网格DP
路径不同路径数O(m·n)组合数/路径数
路径三角形最小路径和O(n²)自底向上 DP
路径Floyd-WarshallO(n³)全源最短路
路径Bellman-FordO(VE)单源最短路,可负权
博弈/特殊蛋掉落问题O(n·k)最坏情况优化
博弈/特殊最大子数组和 (Kadane)O(n)连续子数组最大和
博弈/特殊加权区间调度O(n log n)区间选择+权重
博弈/特殊Nim 游戏(DP 变种)O(n·状态)博弈状态转移

📌 斐波那契数列算法思想与复杂度

  1. 暴力递归
    • 定义:直接根据 F(n) = F(n-1) + F(n-2) 递归求解
    • 复杂度:O(2^n)
    • 特点:有大量重复子问题,不是严格意义上的分治(因为分治强调“子问题不重叠”)。
  2. 动态规划
    • 自顶向下(记忆化搜索)
    • 自底向上(迭代表格法)
    • 复杂度:O(n),空间可优化到 O(1)
    • 特点:保存子问题结果,避免重复计算。
  3. 高效解法
    • 矩阵快速幂:O(log n)
    • 通项公式(Binet 公式):O(1)(有精度问题)

🎯 关键结论

  • O(2^n) 解法:应该称为暴力递归,而不是“分治法”。
  • 分治法:虽然名字上也用递归,但核心要求是“子问题互不重叠”,而斐波那契递归是重叠子问题的典型 → 所以严格来说它是 DP 的反例,不是“分治”。
  • O(n) 解法:才是 动态规划 的正宗体现。

考过的算法记录

希尔排序

  • 20年

动态规划

  • 0-1背包问题 200911
  • 最大字符匹配对数 202811
  • 切杆问题 201805
  • 最长公共子串 201511
  • 矩阵链乘法 201311
  • 编辑距离定义DNA序列 202111

回溯法

  • N皇后 201905/201505

分治

  • 归并 201405

贪心

  • 装箱 201211