复杂度速查表
本篇基本上是原作的翻译。转载请保留本段文字。
复杂度通常会使用大-O 记号来表示,比如快速排序的平均时间复杂度是 O(nlog(n))O(nlog(n))。虽然我是「理解派」,但是虽然每个算法/数据结构都理解了,不时仍有可能忘记具体某个算法/数据结构的复杂度(特别是在最好、最坏和平均情形下的复杂度)。因此制作一个速查表是蛮有必要的。
动手前先看看是否已经有轮子是一个好习惯,果不其然,我找到了原作。
图例
抽象数据结构的操作复杂度
数据结构 | 时间复杂度 | 空间复杂度 |
---|
| 平均 | 最差 | 最差 |
---|
| 访问 | 搜索 | 插入 | 删除 | 访问 | 搜索 | 插入 | 删除 | |
---|
顺序表 | O(1)O(1) | O(n)O(n) | O(n)O(n) | O(n)O(n) | O(1)O(1) | O(n)O(n) | O(n)O(n) | O(n)O(n) | O(n)O(n) |
栈 | O(n)O(n) | O(n)O(n) | O(1)O(1) | O(1)O(1) | O(n)O(n) | O(n)O(n) | O(1)O(1) | O(1)O(1) | O(n)O(n) |
单链表 | O(n)O(n) | O(n)O(n) | O(1)O(1) | O(1)O(1) | O(n)O(n) | O(n)O(n) | O(1)O(1) | O(1)O(1) | O(n)O(n) |
双链表 | O(n)O(n) | O(n)O(n) | O(1)O(1) | O(1)O(1) | O(n)O(n) | O(n)O(n) | O(1)O(1) | O(1)O(1) | O(n)O(n) |
跳表 | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(n)O(n) | O(n)O(n) | O(n)O(n) | O(n)O(n) | O(nlog(n))O(nlog(n)) |
散列表 | - | O(1)O(1) | O(1)O(1) | O(1)O(1) | - | O(n)O(n) | O(n)O(n) | O(n)O(n) | O(n)O(n) |
二叉搜索树 | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(n)O(n) | O(n)O(n) | O(n)O(n) | O(n)O(n) | O(n)O(n) |
笛卡尔树 | - | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | - | O(n)O(n) | O(n)O(n) | O(n)O(n) | O(n)O(n) |
B-树 | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(n)O(n) |
红黑树 | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(n)O(n) |
伸展树 | - | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | - | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(n)O(n) |
AVL 树 | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(n)O(n) |
数组排序
算法 | 时间复杂度 | 空间复杂度 |
---|
| 最佳 | 平均 | 最差 | 最差 |
---|
快速排序 | O(nlog(n))O(nlog(n)) | O(nlog(n))O(nlog(n)) | O(n2)O(n2) | O(log(n))O(log(n)) |
归并排序 | O(nlog(n))O(nlog(n)) | O(nlog(n))O(nlog(n)) | O(nlog(n))O(nlog(n)) | O(n)O(n) |
Timsort | O(n)O(n) | O(nlog(n))O(nlog(n)) | O(nlog(n))O(nlog(n)) | O(n)O(n) |
堆排序 | O(nlog(n))O(nlog(n)) | O(nlog(n))O(nlog(n)) | O(nlog(n))O(nlog(n)) | O(1)O(1) |
冒泡排序 | O(n)O(n) | O(n2)O(n2) | O(n2)O(n2) | O(1)O(1) |
插入排序 | O(n)O(n) | O(n2)O(n2) | O(n2)O(n2) | O(1)O(1) |
选择排序 | O(n2)O(n2) | O(n2)O(n2) | O(n2)O(n2) | O(1)O(1) |
希尔排序 | O(n)O(n) | O((nlog(n))2)O((nlog(n))2) | O((nlog(n))2)O((nlog(n))2) | O(1)O(1) |
桶排序 | O(n+k)O(n+k) | O(n+k)O(n+k) | O(n2)O(n2) | O(n)O(n) |
基数排序 | O(nk)O(nk) | O(nk)O(nk) | O(nk)O(nk) | O(n+k)O(n+k) |
图操作
节点 / 边界管理 | 存储 | 增加顶点 | 增加边界 | 移除顶点 | 移除边界 | 查询 |
---|
邻接表 | O(|V|+|E|)O(|V|+|E|) | O(1)O(1) | O(1)O(1) | O(|V|+|E|)O(|V|+|E|) | O(|E|)O(|E|) | O(|V|)O(|V|) |
邻接矩阵 | O(|V|2)O(|V|2) | O(|V|2)O(|V|2) | O(1)O(1) | O(|V|2)O(|V|2) | O(1)O(1) | O(1)O(1) |
堆操作
类型 | 时间复杂度 |
---|
| 建堆 | 查找最大值 | 分离最大值 | 提升键 | 插入 | 删除 | 合并 |
---|
(排好序的)链表 | - | O(1)O(1) | O(1)O(1) | O(n)O(n) | O(n)O(n) | O(1)O(1) | O(m+n)O(m+n) |
(未排序的)链表 | - | O(n)O(n) | O(n)O(n) | O(1)O(1) | O(1)O(1) | O(1)O(1) | O(1)O(1) |
二叉堆 | O(n)O(n) | O(1)O(1) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(m+n)O(m+n) |
二项堆 | - | O(1)O(1) | O(log(n))O(log(n)) | O(log(n))O(log(n)) | O(1)O(1) | O(log(n))O(log(n)) | O(log(n))O(log(n)) |
斐波那契堆 | - | O(1)O(1) | O(log(n))O(log(n)) | O(1)O(1) | O(1)O(1) | O(log(n))O(log(n)) | O(1)O(1) |
大-O 复杂度曲线
俗话说,投资效率是最好的投资。 如果您感觉我的文章质量不错,读后收获很大,预计能为您提高 10% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。