大O表示法
前面有两篇总结了排序算法,最近刚好在看《算法图解》,想由表及里整理一份算法系列。每次介绍算法时,都会讨论其运行时间,一般而言,应选择效率最高的算法,以最大限度地减少运行时间或占用空间。那怎么表示算法的速度呢,今天来了解一下:大O表示法。
理解大O表示法
大O表示法是一种特殊的表示法,指出了算法的速度有多快。我们举个例子:假设列表包含n个元素,简单的查询需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为:O(n)。单位?没有,大O表示法指的是算法运行时间的增速,不需要单位来描述。
我们再来看一个例子:为检查长度为n的列表元素,我们来使用二分查找,需要执行(log n)次操作。那么使用大O表示法,这个运行时间为:O(log n),这指出了算法需要执行的操作数。
大O表示法指出最糟糕情况下的运行时间
又举个例子:假如使用简单查找的方法,上面说过,简单查找的运行时间为O(n),这意味着在最糟的情况下,必须查看每一个元素。如果我们要找到1024这个数字,刚好第一个数字就是我们要找的,那这种算法的运行时间是O(n)还是O(1)呢?这里我们总结一下,简单查找的运行时间总是为O(n),查找1024元素时,一次就找到了,这是最佳的情况,但大O表示法表示的是最糟的情形。我们可以这样说:简单查找的运行时间不可能超过O(n)。
除了最糟的情况下的运行时间,我们还得考虑平均情况的运行时间。
一些常见的大O的运行时间
- O(log n),也叫
对数时间
,这样的算法包括二分查找。 - O(n),也叫
线性时间
,这样的算法包括简单查找。 - O(n * log n),这样的算法包括快速排序。
- O(n^2),这样的算法包括选择排序。
- O(n!),这样的算法包括旅行商问题的解决方案,也是我即将学习的。
- ……
小结
当然了,我们在前面是将大O运行时间表示转换为操作数来理解,我们小结一下:
- 算法的速度指的并非时间,而是操作数的增速。
- 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加。
- 算法的运行时间用法大O表示法表示。