C++抽象编程——算法分析(2)——Big-O表示法

进行如果我们按照上一篇的文章那样的详细分析的问题是您最终得到的信息太多。 虽然有一个公式来预测一个程序将要花多长时间,但是通常可以采取更多的定性措施。 本质上,选择排序的问题在于,将输入向量的大小加倍,将选择排序算法的运行时间增加了四倍,这意味着运行时间比vector中的元素数量的增长快得多。
你可以获得关于**算法效率的最有价值的定性观察通常是帮助你了解当问题的规模大小的发生变化算法时的算法性能如何响应。**问题大小通常很容易量化。对于对数字进行操作的算法,通常使数字本身代表问题大小。对于大多数数组或vector进行操作的算法,可以使用元素的个数数来代表。在评估算法效率时,计算机科学家传统上使用字母N来表示问题的大小。无论如何计算。 当N逐渐增大,N与N之间的算法性能之间的关系,称为该算法的计算复杂度。The relationship between N and the performance of an algorithm as N becomes large is called the computational complexity of that algorithm.)一般来说,最重要的性能指标是执行时间,尽管也可以将复杂性分析应用于其他问题,如所需的内存空间。除非另有说明,否则使用的所有复杂性评估均指执行时间(因为随着科技的发展,现在的空间已经不是首要的考虑因素)。
##Big-O表示法
计算机科学家使用一种称为大O符号的特殊速记符号来表示算法的计算复杂度。该符号是德国数学家保罗·巴赫曼(Paul Bachmann)在1892年前在计算机开发之前提出的。**符号本身很简单,由字母O组成,后跟括号括起来的公式。当用于指定计算复杂度时,公式通常是涉及问题大小N的简单函数。**例如,下列的表达式:
在这里插入图片描述
读作 “big-oh of N squared.”
大O表示法用于指定定性近似,因此是表达算法的计算复杂度的理想选择。与数学一样,大O表示法有一个精确的定义,这个定义在以后再说。然而,在这一点上,对于你来说,无论你认为自己是程序员还是计算机科学家,都应该从更直观的角度了解大O到底意味着什么。
##标准简化Big-O
当使用大O符号来估计算法的计算复杂度时,目的是提供一个定性的观察,以便观察当N中的变化(如N变大)是怎么影响算法性能的。因为大O表示法并不是一个量化措施,所以要减少括号内的公式,以便以最简单的形式捕获算法的定性行为。使用big-O表示法时可以使用的最常见的简化如下:

  1. 消除N变大时候任何对N总量的贡献不再显着的任何部分Eliminate any term whose contribution to the total ceases to be significant as N becomes large)。当一个公式涉及多个部分时,其中一个部分通常比其他部分增长得更快,并且随着N变大而最终导致影响整个表达式。对于N值较大的值,此部分单独控制算法的运行时间,你可以完全忽略公式中的其他部分。
  2. 消除任何常数因素。Eliminate any constant factors.) 当你计算计算复杂度时,主要关注的是运行时间如何随着问题大小N的变化而变化。常数因子对整体模式没有影响。 如果你购买的机器的运行速度是旧机器的两倍,那么在你的机器上执行的任何算法的运行速度将为N的每个值的两倍。然而,增长模式将保持不变。因此,当使用大O符号时,可以忽略常量因子。

##选择排序的计算复杂度
我们可以应用前面部分的简化规则来为选择排序的计算复杂度导出一个big-O表达式。从前面看来,N个元素向量的选择排序算法的运行时间与下面的公式成比例:
在这里插入图片描述
尽管在big-O表达式中直接使用这个公式是数学上正确的
在这里插入图片描述
但是在实践中我们永远不会这样做,因为括号内的公式不以最简单的形式表示。简化这种关系的第一步是认识到公式实际上是两个部分的总和,如下;
在这里插入图片描述
然后,您需要考虑每个这些部分对总体公式的贡献,因为N的大小增加,如下表所示:
在这里插入图片描述
随着N的增加,涉及N平方的部分语很快主导了涉及N的部分。因此,简化规则允许您从表达式中消除较小的项。所以此时我们所得到的是这个:
在这里插入图片描述
因为这里还有我们所谓的常数2,根据第二个规则,我们把它消除,得到的最终最简化的版本是:
在这里插入图片描述
此表达式捕获了选择排序的性能的本质。随着问题的大小增加,运行时间趋向于问题增长的平方。 因此,如果你将vector的大小加倍,则运行时间将增加四倍。如果你将输入值的数量乘以10,则运行时间将会增加100倍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值