CSP-J/S算法----时间复杂度列表
1️⃣ 数组与排序
| 算法 | 最好/平均/最坏情况 | 备注 |
|---|
| 直接插入排序 | O(n)/O(n²)/O(n²) | 小数据量快 |
| 选择排序 | O(n²)/O(n²)/O(n²) | 不稳定 |
| 冒泡排序 | O(n)/O(n²)/O(n²) | 不稳定 |
| 快速排序 | O(n log n)/O(n log n)/O(n²) | 常用排序 |
| 归并排序 | O(n log n)/O(n log n)/O(n log n) | 稳定 |
| 堆排序 | O(n log n) | 不稳定,适合优先队列 |
| STL sort(C++) | O(n log n) | 内部通常用快排/堆排混合 |
| STL stable_sort | O(n log² n) | 稳定排序 |
2️⃣ 查找与集合
| 算法 | 时间复杂度 | 备注 |
|---|
| 顺序查找 | O(n) | 简单 |
| 二分查找 | O(log n) | 数据需有序 |
| 哈希查找 | O(1) 平均 / O(n) 最坏 | unordered_map/set |
| STL map/set (红黑树) | O(log n) | 有序集合 |
3️⃣ 树与堆
| 数据结构 | 插入/删除/查询 | 备注 |
|---|
| 二叉搜索树 | O(h) | h = 树高,最坏 O(n) |
| 平衡树 (AVL/红黑) | O(log n) | 常用 STL map/set |
| 堆 (优先队列) | O(log n) | push/pop/top |
4️⃣ 图算法
| 算法 | 时间复杂度 | 备注 |
|---|
| BFS / DFS | O(V+E) | V = 顶点数,E = 边数 |
| Dijkstra (邻接矩阵) | O(V²) | 小图 |
| Dijkstra (邻接表 + 堆) | O(E log V) | 大图优先 |
| Floyd-Warshall | O(V³) | 全源最短路径 |
| Bellman-Ford | O(VE) | 可处理负权边 |
| Kruskal | O(E log E) | 最小生成树 |
| Prim (堆) | O(E log V) | 最小生成树 |
| 拓扑排序 | O(V+E) | DAG |
5️⃣ 字符串算法
| 算法 | 时间复杂度 | 备注 |
|---|
| 字符串匹配 (暴力) | O(nm) | n = 主串长度,m = 模式串长度 |
| KMP | O(n+m) | 常用模式匹配 |
| Trie 插入/查询 | O(len) | len = 字符串长度 |
| Rabin-Karp | O(n+m) 平均 | 滚动哈希 |
6️⃣ 动态规划
| 算法 | 时间复杂度 | 空间复杂度 |
|---|
| 一维背包 | O(nW) | O(W) |
| 二维背包 | O(nW) | O(nW) |
| 最长公共子序列 | O(nm) | O(nm) / 优化 O(min(n,m)) |
| 树形 DP | O(n) | O(n) |
| 状态压缩 DP | O(n 2^n) | O(2^n) |
7️⃣ 其他常用复杂度估算
组合 / 枚举:
枚举所有子集:O(2^n)
枚举排列:O(n!)
数学 / 计数:
素数筛法 (埃拉托色尼筛法):O(n log log n)
素数筛法 (线性筛法):O( n )
GCD / LCM: O(log max(a,b))
💡 经验口诀(常用竞赛 n 值和时间复杂度):
n ≤ 10 → O(n!), O(2^n) 可行
n ≤ 20 → O(2^n) 可行
n ≤ 500 → O(n³) 可行
n ≤ 10⁴ → O(n²) 可行
n ≤ 10⁵~10⁶ → O(n log n) 可行
n ≤ 10⁷~10⁸ → O(n) 可行
