算法設计技巧与分析翻译.docVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法設计技巧与分析翻译

算法设计技巧与分析 1.8时间复杂性 这一节研究算法分析的一个基本组成部分,即算法运行时间的确定问题。这个称为计算复杂性的问题,属于计算理论中的一个重要领域,它是由于对有效算法的需求而发展起来的,产生于上世六十年代,繁荣于七八十年代。在计算复杂性领域中,研究的主要目的是一个算法所需要的时间和空间,即当给出合法输入时,为了得到输出,该算法所需要的时间和空间。本节以一个例子开始,它唯一的目的是为了展现分析算法运行时间的重要性。 例1.4 前面已经说过,当n为2的幂时,执行算法BOTTOMUPSORT的元素比较最大次数是n log n-n+1,执行算法SELECTIONSORT 的元素比较次数是n(n-1)/2,元素可以使整数、实数和字符串等。具体地说,假设某种计算机上每一次元素比较需要10秒,假如我们要对一个小的数目,比如128个元素进行排序,那么用算法BOTTOMUPSORT的话,它用在元素比较上所需要的最长时间为10 (128×7-128+1)=0.0008秒;若用算法SELECTIONSORT,时间为10 (128×127)/2=0.008秒。换句话说,算法BOTTOMUPSORTSROT用的比较时间是算法SELECTIONSORT的1/10。这当然不会引起人们的注意,尤其对于一个初学编程的人来说,他主要关心的是开发出一个能完成该任务的程序。然而,如果考虑到一个大一点的数,比如n=2=1048576,一个在现实世界的许多问题中很典型的数,我们会发现:用算法BOTTOMUPSORT的元素比较所需要的最长时间是10(2×20-2+1)=20秒,而用算法SELECTIONSORT,比较时间变成了10(2×(2-1))/2=6.4天! 上面的例子中的计算表明了这样的事实:在算法分析研究中,时间毫无疑问是一种最珍贵的资源 1.8.1阶的增长 显而易见,说一个算法A对于输入x要用y秒运行时没有意义的。这是因为影响实际时间的因素不仅有相应算法,还有其他诸多因素,例如算法是在什么机器上和怎样执行的,用的是哪一种语言,甚至编译程序或程序员的能力都有影响。因此只要得出确切时间还是近似时间?事实上,我们甚至不需要近似时间,这是由许多因素支持的。首先,在分析算法运行时间时,我们通常将该算法和解决同一问题甚至是不同问题的算法相比较,这样,估计时间是相对的而不是绝对的;其次,我们希望一个算法不仅是独立于机器的,而且它也能用各种语言来表示,甚至是人类的语言;再者,它还应该是技术独立的,也就是说,无论科技图和进步,我们对算法运行时间的测度始终成立;第四,我们主要不是关心小规模输入量的情况、最关心的是在大的输入实例时,算法的运行情况。 事实上,在算法的某个“合理”实现中的计算运算次数,是比它多需要的多了一些。作为上面第四种因素的推论,我们可以进一大步:要精确计算多的运算次数,如果不是不可能的话,也是非常麻烦的。由于我们只对大的输入时的运行时间感兴趣,可以讨论运行时间的增长率或增长的阶。例如,如果可以找到某个常量c﹥0,当给算法A以大小为n的输入时,算法的运行时间至多为cn,随着n越来越大,c将逐渐不起作用。进一步,把这个函数和另一个求解同一问题的算法B的不同阶的函数(例如dn)做比较,很明显,该常量不起多大的作用。同理可用于函数f(n)=nlog n+10n+n中的低阶项上,我们观察到n值越大,低阶项10n和n的影响越小。因此,可以说算法A和B的运行时间分别为“n阶和n阶的”或属于“n阶和n阶的”。类似地,我们说上面的函数f(n)是nlog n的阶的。 一旦去除了表示算法运行时间的函数中的低阶和首项常数,就称我们是在度量算法的渐近运行时间。与此相同,在算法分析的术语中,可以用更为技术性的术语“时间复杂性”来表示这一渐近的时间。 现在假定有两个算法A和A运行时间都为n log n阶,那么其中哪一个更好呢?从技术上看,由于两个算法有同样的时间复杂性,我们就说在一个乘法常数内,它们有相同的运行时间,也就是两个运行时近的比值是常量。在某些情况下,这个常量可能很重要,对算法更详尽的分析或在算法的行为上进行某些试验可能很有帮助。而且这时考察其他因素,例如空间需求和输入分布等也有必要,后者对分析算法运行的平均情况是有帮助的。 图1.5时一些广泛用来表示算法运行时间的函数,高阶函数和指数以及超指数函数没有在这张图上显示出来。即使n为一个中等的值,指数和超指数函数也比途中的几个函数增长得快的多。这几种类型的函数logn,cn,cn,cn分别称为对数函数、线性函数、平方函数和立方函数,下面两种函数的形式n或nlogn,0﹤c﹤1,称为次线性函数;在线性函数和平方函数之间的,如n log n和n。称为次平方函数。表1.1是时间复杂性分别为log n,n,n lo

文档评论(0)

df9v4fzI + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档