以下是常见算法的时间复杂度和空间复杂度总结,按算法类型分类,并附典型示例:


一、排序算法

算法 平均时间复杂度 最坏时间复杂度 空间复杂度 是否稳定
冒泡排序 O(n²) O(n²) O(1)
选择排序 O(n²) O(n²) O(1)
插入排序 O(n²) O(n²) O(1)
快速排序 O(n log n) O(n²) O(log n)
归并排序 O(n log n) O(n log n) O(n)
堆排序 O(n log n) O(n log n) O(1)
计数排序 O(n + k) O(n + k) O(n + k)
桶排序 O(n + k) O(n²) O(n + k)
基数排序 O(n × k) O(n × k) O(n + k)

  • k表示数据的范围(如计数排序中最大最小值差)。
  • 快速排序的最坏情况(已排序数组)可通过随机化避免。

二、搜索算法

算法 时间复杂度 空间复杂度 适用场景
线性搜索 O(n) O(1) 无序数据
二分查找 O(log n) O(1) 有序数组
哈希表查找 O(1) O(n) 无冲突的理想情况
DFS/BFS O(V + E) O(V) 图/树遍历

  • V为顶点数,E为边数(图算法中)。
  • 哈希表查找的复杂度假设哈希函数均匀分布。

三、图算法

算法 时间复杂度 空间复杂度 特点
Dijkstra O((V+E) log V) O(V) 无负权边的最短路径
Bellman-Ford O(V×E) O(V) 可处理负权边
Floyd-Warshall O(V³) O(V²) 多源最短路径
Prim O(E log V) O(V) 最小生成树(MST)
Kruskal O(E log E) O(E) 最小生成树
拓扑排序 O(V + E) O(V) 有向无环图(DAG)

  • Dijkstra 使用优先队列优化后的复杂度。
  • Kruskal 的复杂度基于并查集(Union-Find)优化。

四、动态规划(DP)

问题 时间复杂度 空间复杂度 示例
斐波那契数列 O(n) O(1) dp[i] = dp[i-1] + dp[i-2]
0-1背包问题 O(n×W) O(W) dp[i][w] = max(val[i] + dp[i-1][w-wt[i]], dp[i-1][w])
最长公共子序列 O(m×n) O(m×n) LCS(二维DP表)
矩阵链乘法 O(n³) O(n²) 最优括号化方案

  • W表示背包容量,n为物品数量。
  • 空间复杂度可通过滚动数组优化(如斐波那契数列用两个变量代替数组)。

五、字符串算法

算法 时间复杂度 空间复杂度 用途
KMP算法 O(m + n) O(m) 字符串匹配
Rabin-Karp O(m + n) O(1) 哈希滚动匹配
Trie树 O(L) O(L×N) 前缀匹配(L为单词长度,N为节点数)
Manacher O(n) O(n) 最长回文子串

六、递归与分治

算法 时间复杂度 空间复杂度 示例
汉诺塔问题 O(2ⁿ) O(n) 递归调用栈深度
归并排序 O(n log n) O(n) 分治思想
快速幂 O(log n) O(1) a^n的计算优化

七、其他重要算法

算法 时间复杂度 空间复杂度 应用场景
并查集(路径压缩) O(α(n)) O(n) 连通性检测(α为反阿克曼函数)
欧拉筛法 O(n) O(n) 素数筛选
FFT(快速傅里叶变换) O(n log n) O(n) 信号处理/多项式乘法

总结对比

复杂度级别 典型算法 适用场景
O(1) 哈希表访问 高频查询
O(log n) 二分查找、堆操作 有序数据操作
O(n) 线性搜索、计数排序 小规模数据处理
O(n log n) 快速排序、归并排序 大规模排序
O(n²) 冒泡排序、Floyd-Warshall 小规模计算
O(2ⁿ)/O(n!) 回溯、暴力穷举 极小规模组合问题

总结

  1. 排序算法:快速排序、归并排序、堆排序是 O(n log n)的“三巨头”。
  2. 图算法:Dijkstra 和 Prim 用优先队列优化,复杂度含 log V
  3. 动态规划:空间复杂度常可优化(如滚动数组)。
  4. 递归算法:注意栈空间(如汉诺塔的 O(n)空间)。