13 · 复杂度速查表

快速参考数据结构和算法的时空复杂度。
面试中能分析复杂度是基本要求,也是优化思路的来源。


一、数据结构复杂度

数据结构查找插入删除随机访问空间
数组O(n)O(n)O(n)O(1)O(n)
有序数组O(log n)O(n)O(n)O(1)O(n)
链表O(n)O(1)O(1)O(n)O(n)
哈希表O(1) 平均O(1) 平均O(1) 平均O(n)
O(1)O(1)O(n)
队列O(1)O(1)O(n)
二叉搜索树O(log n) 平均O(log n) 平均O(log n) 平均O(n)
O(n) 建堆O(log n)O(log n)O(n)
TrieO(k)O(k)O(k)O(n×k)

注: k 表示字符串长度或树的深度


二、排序算法复杂度

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

三、算法思想复杂度速查

算法思想典型场景时间复杂度空间复杂度
双指针有序数组、链表O(n)O(1)
滑动窗口子串/子数组O(n)O(k)
二分查找有序数据O(log n)O(1)
回溯排列、组合、子集O(指数级)O(n)
动态规划最优化问题O(n)~O(n²)~O(n³)可优化
贪心局部最优=全局最优O(n)~O(n log n)O(1)~O(n)
DFS树/图/网格O(V+E)O(V)
BFS最短路径、层序O(V+E)O(V)
拓扑排序有向无环图O(V+E)O(V)
并查集连通性O(α(n)) 近乎 O(1)O(n)

四、Python 常用操作复杂度

操作时间复杂度
list.append(x)O(1) 摊还
list.pop()O(1)
list.pop(i)O(n)
list.insert(i, x)O(n)
x in listO(n)
dict[key] / set.addO(1) 平均
x in dict / x in setO(1) 平均
len(obj)O(1)
sorted(list)O(n log n)
list.sort()O(n log n)
min(list) / max(list)O(n)
slicing list[i:j]O(k),k 为切片长度
str1 + str2O(n + m)
', '.join(list)O(n)

五、数据量 → 允许的算法复杂度

数据规模允许的复杂度可选算法
n ≤ 10O(n!)全排列暴力枚举
n ≤ 20O(2ⁿ)子集枚举、状态压缩
n ≤ 100O(n³)Floyd、三重循环 DP
n ≤ 10³O(n²)双重循环 DP、朴素匹配
n ≤ 10⁵O(n log n)排序、二分、分治
n ≤ 10⁶O(n)线性扫描、哈希表
n ≤ 10⁷O(n log n)注意常数因子
n ≤ 10⁸O(n)需要极高效实现
n > 10⁸O(log n) 或 O(1)数学公式、二分

面试中的经验法则

数据范围算法方向
n ≤ 100O(n³) 没问题,考虑 DP
n ≤ 1000O(n²) 可接受
n ≤ 10⁵O(n log n) 是安全的,考虑排序/二分
n ≤ 10⁶O(n) 线性算法
n > 10⁶O(n log n) 也要谨慎

六、常见复杂度增长对比

O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!)

n=10:    1 < 3 < 10 < 33 < 100 < 1024 < 3.6M
n=100:   1 < 7 < 100 < 664 < 10K < 1.3e30 < 9.3e157
n=1000:  1 < 10 < 1000 < 9966 < 1M < 很恐怖
n=10⁵:   1 < 17 < 100K < 1.7M < 10^10 < 不可能

面试要点: 能写出 O(n log n) 的算法通常就算合格,O(n²) 需要能分析出来并尝试优化。


七、参考