两个概念
时间复杂度:估算程序执行的次数
空间复杂度:估算程序所占用的存储空间
我们在描述算法复杂度时,常用O(1), O(n), O(logn), O(n logn)等表示对应算法的时间复杂度,是算法的时空复杂度的表示。
它不仅仅用于表示时间复杂度,也用于表示空间复杂度。
这种表示法称之为大O表示法
大O表示法是算法的一种特殊的表示法,指出了算法的速度有多快,它指出了算法运行时间的增速。
需要注意的是大O表示法指的并非以秒为单位的速度,主要可以用来表示时间复杂度和空间复杂度。
简单的说大O表示法仅仅只是定义当数量越多时算法运行时间的增速,增速越慢,即代表算法越快。
时间复杂度
O(1)
O(1):是最低的时间复杂度,表示算法的速度和数量无关,不论数量是多少,算法的速度始终不变,也就是耗时/耗空间与输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变。
哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标(不考虑冲突的话)。
O(n)
O(n):也叫线性时间,表示算法的速度和数量增加呈现线性增长。
典型算法有:简单查找。
即在n个数中轮询查找a所处的位置,当n的数量+1时算法查找的次数也+1。
O(log n)
O(log n):也叫对数时间
典型算法有:二分查找法
即当数量每扩大两倍,查询次数仅仅需要+1次,是一种随着数量越多,算法耗时增速越慢的算法。
O(n²)
典型算法有:选择排序、冒泡排序,是一种速度较慢的排序法。
O(n * log n)
典型算法有:快速排序法,是一种速度较快的排序法。
O(n!)
是一种非常慢的算法
即当数量为n时,查询算法耗时为a时,当数量+1时查询算法将耗时a*(n+1),当数量较多时耗时将变得非常大。
X 数据规模
Y 执行的时间复杂度
注意,大 O 表示法只是一种估算,当数据量大的时候才有用。
大部分情况下你用直觉就可以知道一个算法的大 O 表示法。
比如说,如果你的代码用一个循环遍历你输入的每个元素,那么这个算法就是O(n)。
如果是循环套循环,那就是O(n^2)。如果 3 个循环套在一起就是O(n^3),以此类推。
参考
函数图像绘制工具
https://zh.numberempire.com/graphingcalculator.php
常见的大O表示法有哪些?时间复杂度是什么?
https://www.bilibili.com/video/BV1DY4y1H7DG
算法刷题网站
https://leetcode.com
https://leetcode-cn.com
网友评论