Fork me on GitHub

算法复杂度速查表

复杂度

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

复杂度通常会使用大 O 记号来表示,比如快速排序的平均时间复杂度是 𝑂(𝑛log(𝑛))O(nlog⁡(n))。虽然我是「理解派」,但是虽然每个算法/数据结构都理解了,不时仍有可能忘记具体某个算法/数据结构的复杂度(特别是在最好、最坏和平均情形下的复杂度)。因此制作一个速查表是蛮有必要的。

动手前先看看是否已经有轮子是一个好习惯,果不其然,我找到了原作

时间复杂度

一个算法的时间复杂度反映了程序运行从开始到结束所需要的时间。把算法中基本操作重复执行的次数(频度)作为算法的时间复杂度。

没有循环语句,记作 O(1),也称为常数阶。只有一重循环,则算法的基本操作的执行频度与问题规模n呈线性增大关系,记作 O(n),也叫线性阶。

时间复杂度只关注最高数量级,且与之系数也没有关系。

若不同算法的时间频度不一样,但他们的时间复杂度却可能是一样的。比如:T(n)=n2+2n+4 与 T(n)=4n2+n+8,他们的时间频度显然不一样,但他们的时间复杂度却是一样的,均为O(n2)

空间复杂度

空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。

通常来说,只要算法不涉及到动态分配的空间以及递归、栈所需的空间,空间复杂度通常为0(1)。

算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数,与问题的规模没有关系。

图例

image-20190920164141544

抽象数据结构的操作复杂度

Snipaste_2019-09-20_17-16-14

数组排序

image-20190920164408891

图操作

image-20190920164509533

堆操作

image-20190920164555772

常见递归算法时间复杂度

image-20190920175238411

大-O 复杂度曲线

big_O_chart

image-20190920170026540

转自 https://liam.page/2016/06/20/big-O-cheat-sheet/

posted @ 2019-09-21 10:13 Martini 阅读(...) 评论(...) 编辑 收藏