算法图解1.3-大O表示法

大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!) 非常慢的算法,典型是旅行商问题
    假设你要绘制一个包含16格的网格,且有5种不同的算法可供选择,这些算法的运行时间如上所示。如果你选择第一种算法,绘制该网格所需的操作数将为4(log 16=4)。假设你每秒可执行10次操作,那么绘制该网格需要0.4秒。如果要绘制一个包含1024格的网格呢?这需要执行10(log 1024=10)次操作,换言之,绘制这样的网格需要1秒。这是使用第一种算法的情况。
    这是针对同一个问题,五种不同算法所对应的时间复杂度的曲线。

此时我们应该得到的启示是:

  • 算法的速度并非时间,而是操作数的增速
  • 谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加
  • 算法的运行时间使用大O表示法来表示
  • O(logn) 比O(n)快,当需要搜索的元素越多时,前者比后者快的越多

练习:

  1. 在电话簿中根据名字查找电话号码
    答:运行时间为O(logn) 因为可以使用二分查找来查询名字
  2. 电话簿中根据电话号码找人(提示:你必须查找整个电话簿)
    答:此时根据提示来说运行时间为O(n),因为必须要查找整个电话簿,相当于简单查找
  3. 阅读电话簿中每个人的电话号码
    答:运行时间为O(n)
  4. 阅读电话簿中姓名以A打头的人的电话号码。这个问题比较棘手,它涉及第4章的概念。答案可能让你感到惊讶!
    答:O(n)
    针对26个字母中的一个来操作,运行时间应为O(n/26)但是在大O表示法中常量是忽略的。

旅行商问题
一个旅行商想去五个城市,想从中找到最短的路线。那么就需要找到所有的路线,然后进行筛选,那么在找到所有路线的过程中就是一个O(N!)的运行时间。随着数量级的上升,运行时间会随着指数上升。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值