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

复杂度速查表

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

复杂度一般会使用大-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% 的工做效率,不妨小额捐助我一下,让我有动力继续写出更多好文章。
相关文章
相关标签/搜索