大O表示法是一种特殊的表示法,指出了算法的速度有多快。
本节介绍大O表示法是什么,并使用它列出一些最常见的算法运行时间。
算法的运行时间以不同的速度增加
示例:
Bob要为NASA编写一个查找算法,这个算法在火箭即将登陆月球前开始执行,帮助计算着陆地点。
这个示例表明,两种算法的运行时间呈现不同的增速。Bob需要做出决定,是使用简单查找还是二分查找。使用的算法必须快速而准确。一方面,二分查找的速度更快。Bob必须在10秒钟内找出着陆地点,否则火箭将偏离方向。另一方面,简单查找算法编写起来更容易,因此出现bug的可能性更小。Bob可不希望引导火箭着陆的代码中有bug!为确保万无一失,Bob决定计算两种算法在列表包含100个元素的情况下需要的时间。
综合书上所说的来看,最后根据二分查找和简单查找的数量级而绘制成了一个图:
从图中可以清晰的看到,随着元素数量的增加,二分查找的额外时间并不多,而简单查找的额外时间却很多。
我们必须知道运行时间,是如何随着列表增加而增加的,这正是大O表示法的用武之地。
大O表示法指出了算法有多快。例如,假设列表包含n个元素。简单查找需要检查每个元素,因此需要执行n次操作。使用大O表示法,这个运行时间为O(n)。单位秒呢?没有——大O表示法指的并非以秒为单位的速度。大O表示法让你能够比较操作数,它指出了算法运行时间的增速。
理解不同的大O运行时间
- 算法1 每次画一个格子的方式,画16个格子
- 算法2 对折一张纸,形成16个格子
算法1的运行时间为O(n)
算法2的运行时间为O(log n)
大O表示法指出了最糟情况下的运行时间
一些常见的大O运行时间
- O(log n) 也叫对数时间,常见算法二分查找
- O(n) 线性时间 常见算法简单查找
- O(nlogn) 常见算法快速排序
- O(n2) 常见算法选择排序
- O(n!) 非常慢的算法,典型是旅行商问题
这是针对同一个问题,五种不同算法所对应的时间复杂度的曲线。
此时我们应该得到的启示是:
- 算法的速度并非时间,而是操作数的增速
- 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加
- 算法的运行时间使用大O表示法来表示
- O(logn) 比O(n)快,当需要搜索的元素越多时,前者比后者快的越多
练习:
- 在电话簿中根据名字查找电话号码
答:运行时间为O(logn) 因为可以使用二分查找来查询名字 - 电话簿中根据电话号码找人(提示:你必须查找整个电话簿)
答:此时根据提示来说运行时间为O(n),因为必须要查找整个电话簿,相当于简单查找 - 阅读电话簿中每个人的电话号码
答:运行时间为O(n) - 阅读电话簿中姓名以A打头的人的电话号码。这个问题比较棘手,它涉及第4章的概念。答案可能让你感到惊讶!
答:O(n)
针对26个字母中的一个来操作,运行时间应为O(n/26)但是在大O表示法中常量是忽略的。
旅行商问题
一个旅行商想去五个城市,想从中找到最短的路线。那么就需要找到所有的路线,然后进行筛选,那么在找到所有路线的过程中就是一个O(N!)的运行时间。随着数量级的上升,运行时间会随着指数上升。