常用算法--复杂度速查表

复杂度速查表

本篇基本上是原作的翻译。转载请保留本段文字。

复杂度通常会使用大-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% 的工作效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。
posted @ 2019-08-23 14:50  木林森__𣛧  阅读(340)  评论(0)    收藏  举报