以下是常见算法的时间复杂度和空间复杂度总结,按算法类型分类,并附典型示例:
一、排序算法
算法 |
平均时间复杂度 |
最坏时间复杂度 |
空间复杂度 |
是否稳定 |
冒泡排序 |
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!) |
回溯、暴力穷举 |
极小规模组合问题 |
总结
- 排序算法:快速排序、归并排序、堆排序是
O(n log n)
的“三巨头”。
- 图算法:Dijkstra 和 Prim 用优先队列优化,复杂度含
log V
。
- 动态规划:空间复杂度常可优化(如滚动数组)。
- 递归算法:注意栈空间(如汉诺塔的
O(n)
空间)。