分析算法涉与如何思考他们的资源需要:对时间和空间的使用量会增加使用规模和输入尺寸外文翻译资料

 2022-03-25 08:03

英语原文共 44 页,剩余内容已隐藏,支付完成后下载完整资料


附录X 译文

分析算法涉与如何思考他们的资源需要:对时间和空间的使用量会增加使用规模和输入尺寸。我们这一章首先讨论如何把这个概念用在具体的基础,使混凝土打开大门,使人们对计算追踪能力产生充分的理解。做到这一点,我们开发的数学机械所需要讨论的输入的大小以及不同功能尺度,使一个功能比另一个功能成长更快,含义更精确。

然后,我们开发一些基本算法的运行时间界限,以第一章Gale-Shapley算法的实现作为开始。并继续调查许多不同的运行时间和某些算法的字符类型,实现这些运行时间。在某些情况下,获得良好的运行时间界限依赖于更复杂的数据结构,我们总结本章的一个非常有用的例子,这个例子跟数据结构有关:优先级队列及其使用堆的实现。

1计算可解性

这本书的一大核心是找到有效的算法用来解决计算问题.在这个层面上的一般性上,我们的话题似乎涵盖了整个计算机科学;对我们来说具体的方法是什么?首先,我们将试图找出广泛的主题以及在算法开发中的设计原则。我们将寻找范例式问题和说明方法,用最小的不相关的细节,基本设计有效算法的方法。同时,它对于在真空中追求这些设计原则毫无意义,所以这些问题和我们从基本问题中考虑的方法:这些基本问题来自于计算机科学,和一般的之前作为一个很好的调查计算思想出现在许多领域的算法研究。

我们研究的许多问题共有的另一个特性是从根本上离散性。也就是说,像稳定匹配的问题,它们将涉及一个隐含的搜索建立在一系列大的组合的可能性;并且它们的目标将是有效地找一个是人满意,能明确勾画情况的解决方案。

当我们寻求理解有效计算的一般概念时,我们将主要集中于有效的运行时间:我们希望算法能快速运行。但重要的是,算法在其他资源的使用方面也是也是有效的。特别是算法使用的空间(或内存)的数量,算法是一个问题,也会出现在书中的一些点,因此我们将学习减少执行计算所需的空间数量。

1.1 定义效率的某些初步尝试

我们需要回答的最主要的问题是:我们应该如何把一个有效算法的模糊概念到更具体的东西呢?在对有效性的工作定义的第一步如下。

提出有效的定义(1):一个算法是有效的,当算法实现,它快速地运行输入实例。让我们花一点时间考虑这个定义。在一定程度上,这是很难讨论的:我们研究算法的基本原则的目标之一是致力于仔细的成就和不同算法对执行离散计算问题的表示。

但也有一些重要的东西从这这个定义中缺失,即使我们主要目标是在实际计算机上快速解决实际问题实例。首先,是省略的地方,以及,我们实现一个算法。即使不好的算法可以很快运行小测试用极快速的处理器;即使是好的算法在编码时也能慢慢运行。此外,什么是“真正的”输入实例?我们不了解在实践中遇到的全方位的输入实例,一些输入实例比别其他的输入实例更难。最后,以上提出的定义不要考虑有多好或多坏,一个算法问题的范围大小可以扩展到意想不到的水平。一个常见的情况是,两个非常不同的算法将执行同等大小100输入;输入的大小乘以10倍,一个仍然会很快运行,而另一个消耗大量的时间。

所以我们可以要求的是一个关于,平台独立,实例独立,具有预测价值,增加输入大小。在专注于某一特定要求的后果这种说法,我们至少可以探索其隐含的,高层次的建议:我们需要对形势作一个更为直观的看法.。

我们可以用稳定匹配问题作为例子来指导我们。这个输入有一个自然的“大小”参数N,我们可以采取所有优先列表的表现的顶级尺寸,因为这是对应这个问题的算法将其接收作为输入。n在这个问题上与其它自然参数密切相关:n代表男人的数量和女人的数量。因此,有2n个优先的列表,每一个列表的长度,我们能得到:,禁止使用更多的细粒度更好的数据表示。在考虑问题时,我们将在一个较高的水平上寻求描述一个算法,然后分析它的运行算数时间作为输入大小n的函数。

1.2 最坏情况运行和蛮力搜索

首先,我们将重点分析最坏情况下的运行时间:我们将在算法可能拥有的最大可能运行时间上寻找一个约束。它能对所有输入数据给出一个N,并了解怎样缩放N。把关注点放在最开始表现最差的地方看起来是非常严厉的:如果一个算法在大多数情况下表现良好,只是有一些病理上的输入在上面,得到结果非常缓慢?这当然在某些情况上是一个问题,但是总的来说,最坏情况下的分析算法已被发现做是一个合理的工作在实践中能够获得其效率。

此外,一旦我们决定去做了,在对数学分析路线进行最坏情况分析时很难找到有效替代。最坏情况分析。平均案例分析明显吸引人的选择,其中一个研究算法平均超过“随机”实例的性能有时可以提供可观的洞察力,但往往它可以也成为一个泥潭。正如我们先前观察到的,它很难表达在实践中出现的全部输入实例,因此尝试研究算法的性能在“随机”输入的情况下能很快陷入如何产生随机输入的争论中:相同的算法可以很好地执行一类随机输入而不同的算法则执行得很差。毕竟,算法的实际输入一般不会从随机分布中产生,因此平均案例分析等风险告诉我们更多的是关于随机输入产生的方式,而不是关于算法本身。

因此,我们一般考虑算法运行时间的最坏情况分析。合理的分析参照点能够告诉我们一个运行时间的界是不寻常的还是弱的。而这个参照点是什么呢?第一个简单的入门方法就是与可行解搜索空间上的蛮力搜索进行比较。

让我们回到稳定匹配问题的例子。当稳定匹配输入实例的规模相对较小时,它定义的搜索空间却是巨大的(在n个男人和n个女人之间存在个可能的完美匹配)而我们需要找到一个稳定的匹配,关于这个问题的自然地“蛮力”算法是通过枚举艰难的进行所有的完美匹配,逐个检查,看看他是否稳定。在某种意义上,我们对匹配问题求解的令人吃惊的结果就是惊人巨大的可能性空间里,我们仅需要花费与N成比例的时间就可以找到一个稳定的匹配,这是我们在一个分析层次上得到的结论。我们并没有实现这个算法,也没有在样本优先表上来测验,而只是它进行数学推理。同时,我们的推理也指出,怎样可以在实践中实现这个算法,并且给出完全决定性的证据说明它比穷尽枚举有了更大的改进。

在我们研究的大多数问题中,这将是一个共同的主题:一个简洁的表示,隐含规定了一个巨大的搜索空间。对大多数这类问题,将存在一个明显的蛮力求解:尝试所有的可能性看其中是否有合格的,这种方法不仅总是慢的不能用,而且也不聪明,丝毫没有为我们提供对所研究问题结构的认识,因此在这本书里,如果在我们所强调的算法里存在某种共同思路,他将来自于如下关于效率的另一重定义。

提出的效率定义(2):在分析的层次上,如果一个算法与蛮力搜索比较,最坏情况下达到质量上更好的性能,就说他是有效的。

对我们来说,这将是非常有用的可行定义,在蛮力搜索方面有了实质性改进的算法几乎总是包含着一个推动他们工作的有价值的启发式思想。这些算法也向我们揭示了有关问题本身潜在的固有结构以及计算易解性的某些消息。

至于我们的第二个可行的定义还有一个含糊的问题。我们所说的质量上最好的性能究竟意味着什么?这就是要我们更细心考虑实际的运行时间。并且尝试对合理的运行时间见识什么进行量化。

1.3 多项式时间作为有效性的定义

当人们首先开始从数学上分析离散算法的时候---启动于20世纪60年代的研究思路---对于合理运行时间的概念怎样进行量化开始形成一种多数的看法。自然界中组合问题的搜索空间往往随着输入规模N呈指数增长。如果输入规模增加1,那么可能性的数量将成倍增加,我们希望对于这样一个问题的好算法有一个比较好的比例性质:当输入规模按常数因子增加时,比如说2,算法将只是减慢某个常数因子C。

我们可以把这个上升行为用算数公式表示如下:假设算法有下述性质:存在绝对常数cgt;0和dlt;0使得对每个规模为N的输入实例,它的运行时间是不超过个基本运算步骤,换句话说。它的运行时间至多与成正比,直到现在,我们仍旧故意没说清楚关于一个基本计算步的概念意味着什么---但是用一个模型,可以很容易把它形式化,在这个模型里每一步都对应于标准处理器上一条汇编语言的指令,或者标准程序设计语言比如C或Java中的一行,在任何情况下,这个运行时间的界对某个c和d保持不变,那么我们就说这个算法有一个多项式的运行时间,或者他是一个多项式的运行算法。注意到任何多项式时间的界有着我们正在寻找的上升性质。如果输入规模从N增到2N,运行时间的界从增加到)=c*,它减慢了一个的因子,由于d是一个常数,也是一个个常数,当然,正如人们预期的,低阶多项式比高阶多项式显示了更好的上升行为。

从这一概念以及上述的直观印象,形成了我们对效率可行性定义的第三次尝试。

先前的定义似乎过于模糊,而这一似乎是规定的过多,且有与成正比的运行时间----因此是多项式时间的算法难道不是令人绝望的效率低下么?具有的非多项式运行时间的算法,对我们而言不更令人满意吗?当然两个答案都是。的确,尽管人们可以做许多尝试,力图在理论上推动以多项式时间定义效率的想法。相反,那些没有多项式时间算法的问题往往在实践中被认为是非常困难的。对这一原则的两个方面存在某些例外:例如存在某些情况,其中具有指数最坏情况行为的某算法一般对实践中产生的某些类型的实例运行的很好。也存在某些情况,其中对于某个问题的最好的多项式时间算法完全不切实际,这是归罪于多项式界的某些大常数或者高的指数。所以这些都强化了这些观点。即我们强调的最坏情况。多项式时间的具体数学定义在实践中与我们观察到的关于算法效率以及实际生活中的问题的易解性惊人的一致。

数学形式和经验数据似乎对多项式实时间可解性的情况画了一条很好的线。这是为什么?一个进一步的理由是,在多项式函数和指数函数的增长率之间的公式是巨大的。例如,假设我们有一个每秒钟执行一百万条高级指令的处理器,我们有具有运行时间界为n,,,,1,5,和的算法。对规模n=10,30,50,100,1000,10000,100000和1000000的输入,在表2.1我们显示了这些算法的运行时间(以秒分天年为单位)

把我们关于效率的定义提出的如此详细而精确有一个最终的,基本的好处。他能表示否定。它能表达下面的概念:对某个特定问题不存在有效算法。在某种意义上,能够做到这一点是将我们关于算法的研究转入高质量科学的先决条件,因为它允许我们将有效算法的存在和不存在作为一个良好定义的定义来询问。相反,我们前面的两个定义完全是主观的,因此限制了我们的范围只能是以具体的概念讨论某些问题。

特别是我们的第一个定义,它与一个算法的特定实现紧紧捆绑在一起,把效率转换成一个移动目标:随着处理器速度的增加,越来越多的算法落到这样一个有效的概念里。我们按照多项式时间的定义是一个完美的多的概念。他与下述想法密切相关。即每个问题具有固有的计算可解性的层次:某些能够被有效的求解,而其他的不行。

表2.1对于一台每秒执行一百万条高级指令的处理器,不同的算法随输入规模增长的大致运行时间,在运行时间超过〖10〗^25年的情况下,我们把这个算法简记为时间非常长

2 增长的渐进阶

我们关于计算可解性的讨论本质上原来是给予我们表达下数概念的能力:一个算法在规模为n的输入上最坏情况运行时间增长率至多于某个函数f(n)成正比。函数f(n)因此就变成了这个算法运行时间的一个界,我们现在讨论这个概念的框架。

我们将主要以GALE我们将主要表达算法的伪代码风格,我们使用

对于Gale-Shapley算法。有时我们需要变得更正式,但这种指定算法的风格将完全适用于大多数目的。当我们提供一个绑定的运行时间的算法,我们通常会计算这种伪代码步骤的数量.在此上下文中,一个步骤将包括将值分配给变量,在数组中查找一个条目,跟随指针或执行在fi固定大小的整数算术运算。当我们试图对一个算法的运行时间说些什么n大小的输入,我们可以瞄准的一件事是一个非常具体的声明.例如,“在任何输入大小为n,算法运行 ,总的目标有几个错误。首先,得到这样一个精确的绑定可能是一个筋疲力尽的活动,和更多的细节比我们想要的反正。第二,因为我们的最终目标是识别广泛的算法类有类似的行为,我们实际上喜欢分类的运行时间在一个较粗粒度级别,使不同算法之间的相似性,并在不同的问题,表现得更清楚。最后,fi,非常详细关于算法执行的步骤数的语句通常在强烈的意义上的无意义。正如刚才讨论的,我们通常会计算在一个伪代码规范阳离子的一种算法,类似于一个高高的台阶—层次程序设计语言。这些步骤中的每一个通常会展开一些fi固定原始步骤数当程序编译成

总的目标有几个错误。首先,得到这样一个精确的绑定可能是一个筋疲力尽的活动,和更多的细节比我们想要的反正。第二,因为我们的最终目标是识别广泛的算法类有类似的行为,我们实际上喜欢分类的运行时间在一个较粗粒度级别,使不同算法之间的相似性,并在不同的问题,表现得更清楚。最后,非常详细关于算法执行的步骤数的语句通常在强烈的意义上的无意义。正如刚才讨论的,我们通常会计算在一个伪代码规范fi阳离子的一种算法,类似于一个高高的台阶—

层次程序设计语言。这些步骤中的每一个通常会展开一些fi固定原始步骤数当程序编译成3.5n 8步。”这可能是在某些情况下,一个有趣的说法,但一个中间表示,然后再进入一些进一步的步骤根据特定的架构被用来做计算。所以我们可以安全地说的是,当我们看着不同层次的计算抽象,一个“步骤”的概念可以增长或缩小由一个常数因子—例如,如果需要25个低级别的机器指令执行一个

在我们的高级语言的操作,那么我们的算法在更接近实际硬件的层次分析它时,也可以被看成用了40.5 87.5n 200步。

2.1 o,Omega;和Theta;

因为所有这些理由,我们想以一种不受常数因子和低项影响的方式

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[484292],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。