第三章 算法分析.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Chapter 3 Algorithm Analysis 本章介绍了算法分析的基础。算法分析是评价一个算法资源消耗的方法。它允许我们对解决同一问题的两个或多个算法相关代价进行比较。算法分析也给出算法设计者一个用来判定提出的问题解决方案是否符合问题的资源限制的评价工具。读过此章后,你将理解: 增长率的概念,算法的代价随着问题输入规模的增长而增长的比率。 增长率的上、下界的概念,对一个简单的程序,算法或问题如何估计边界。和 算法(或问题)的代价和问题的代价间的不同。 本章最后对在靠经验度量一个程序的代价时所面临的实际问题进行了简短的讨论,同时,还对调整代码以提高程序效率的一些准则进行了讨论。 3.1 简介 你如何对解决某些问题的两个算法在效率上进行比较?一个方法是将两个方法都实现为计算机程序,并在一个合适的输入范围内运行它们,度量在问题中的每个程序使用了多少资源。这个方法由于四个原因通常不能令人满意。首先,需要对两个算法的编程和测试投入精力,而它们中你最多保留一个。第二,当依靠经验比较两个算法时,总会说一个程序比另一个程序“写得好”,而相应的被选中的算法的质量并不能真正代表它们的实现。第三,依靠经验的测试例的选择可能不适合一个算法。第四,你会发现即使是两个算法中较好的那个算法也不会符合你的资源预算---你必须再次开始实现一个新算法的另一个程序实现的全过程。 这些问题通常可以通过使用一种被称为“渐进算法分析”(asymptotic algorithm analysis)或简称为“算法分析”的技术来避免。随着输入规模变大,算法分析度量一个算法或它作为程序的实现的效率。这实际上是一种输入技术,并且不会告诉我们两个程序的任何相关的优点,说一个“稍快于”另一个。然而,渐进算法分析已经证明对计算机科学家是有用的,当他们必须确定一个算法是否值得实现时。 一个程序的临界资源是它的运行时间。然而,你不能只注意时间。你也必须注意其它的因素,比如运行程序的空间请求(主存和磁盘空间)。你需要分析一个算法需要的时间(或一个算法实例化为一个程序的形式),和一个数据结构需要的空间。 有许多因素影响一个程序的运行时间。有一些同编译和运行的环境相关。这些因素包括计算机CPU和总线的速度,和外围硬件。同其它用户竞争资源会使程序变慢。程序设计语言和特定编译器生成的代码质量也有重要的影响。将算法转换为程序的程序员的“编码效率”也一样有重要的作用。 如果你需要使一个程序在特定计算机的时间和空间限制下运行,则所有的因素都是相关的。然而,这些因素在两个算法或数据结构之间不应有所不同。为公平起见,解决同一问题的两个算法所生成的程序应该用相同的编译器编译并在同一机器上在相同条件下运行。尽可能地,对程序予以相同程度的关注以使得实现具有“相等的效率”。在这个意义上,上面所提到的所有因素都应退出比较,由于它们对所有算法所起的作用都是相等的。 如果你真的希望理解算法的运行时间,还有比机器速度,程序设计语言,编译器等等更适合考虑的其他因素。理想情况下我们将在标准的基准条件下度量算法的运行时间。然而,我们除了在机器上运行算法的一个实现外,没有可靠地计算运行时间的方法。唯一可选的方法是使用其它的度量方法来做运行时间的近似。 估量一个算法性能的主要考虑是算法需要处理特定规模输入的基本操作的数量。术语“基本操作”和“规模”都是很模糊的词并且依赖于被分析的算法。尺寸通常是被处理的输入个数。例如,当比较排序算法时,问题规模典型地是靠待排序记录的个数来度量的。一个基本操作必须具有它的完成时间不依赖于它操作数的特定值的属性。在许多程序语言里,加或比较两个整数是基本操作的常见例子。包含n个整数的数组内容求和不是基本操作的例子,由于代价依赖于n值(即:输入规模)。 例3.1 考虑一个简单算法,解决在有n个整数的数组里寻找最大值的问题。算法依次查找每个数,存储当前的最大值。这个算法也叫最大值顺序搜索,由下面的Java函数说明: Static int largest(int[] array) { Int currLargest=0; For (int i=0;iarray.length; i++) If(array[i] currLargest) currLargest = array[i]; return currLargest; } 这里,问题的规模是n,在array中存储的整数个数。基本操作是“检查”单个整数,将它同存储到目前为止最大整数的变量进行比较。假设检查数组中一个整数所需要的时间为固定值,而忽略那个整数的值或它在数组中的位置是合理的。 由于影响运行时间的最重要因素是输入的正常规模,对给定的输入规模n,我们通常用T来表示运行算法的n的函数,记作T(n)。注意我们总是假设T(n)

文档评论(0)

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

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

1亿VIP精品文档

相关文档