算法分析与设计论文[精品文档]

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计与分析论文

题目0-1背包问题的算法设计策略对比与分析专业

班级

学号

姓名

引言

对于计算机科学来说,算法(Algorithm)的概念是至关重要的。算法是一系列解决问题的清晰指令,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

算法可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤。或者看成按照要求设计好的有限的确切的计算序列,并且这样的步骤和序列可以解决一类问题。算法可以使用自然语言、伪代码、流程图等多种不同的方法来描述。

一个算法应该具有以下五个重要的特征:

有穷性:一个算法必须保证执行有限步之后结束;

确切性:算法的每一步骤必须有确切的定义;

输入:一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定除了初始条件;

输出:一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;

可行性:算法原则上能够精确地运行,而且人们用笔和纸做有限次运算后即可完成。

计算机科学家尼克劳斯-沃思曾著过一本著名的书《数据结构十算法= 程序》,可见算法在计算机科学界与计算机应用界的地位。

1 算法复杂性分析的方法介绍

算法的复杂性是算法效率的度量,是评价算法优劣的重要依据。一个算法的复杂性的高低体现在运行该算法所需要的计算机资源的多少上面,所需的资源越多,我们就说该算法的复杂性越高;反之,所需的资源越低,则该算法的复杂性越低。

计算机的资源,最重要的是时间和空间(即存储器)资源。因而,算法的复杂性有时间复杂性和空间复杂性之分。

不言而喻,对于任意给定的问题,设计出复杂性尽可能地的算法是我们在设计算法是追求的一个重要目标;另一方面,当给定的问题已有多种算法时,选择其中复杂性最低者,是我们在选用算法适应遵循的一个重要准则。因此,算法的复杂性分析对算法的设计或选用有着重要的指导意义和实用价值。

关于算法的复杂性,有两个问题要弄清楚:用怎样的一个量来表达一个算法的复杂性;对于给定的一个算法,怎样具体计算它的复杂性。

让我们从比较两对具体算法的效率开始。

1.1比较两对算法的效率

考虑问题1:已知不重复且已经按从小到大排好的m个整数的数组A[1..m](为简单起见。还设m=2 k,k是一个确定的非负整数)。对于给定的整数c,要求寻找一个下标i,使得A[i]=c;若找不到,则返回一个0。

问题1的一个简单的算法是:从头到尾扫描数组A。照此,或者扫到A的第i个分量,经检测满足A[i]=c;或者扫到A的最后一个分量,经检测仍不满足A[i]=c。我们用一个函数Search来表达这个算法:

Function Search (c:integer):integer;

Var J:integer;

Begin

J:=1; {初始化}

{在还没有到达A的最后一个分量且等于c的分量还没有找到时,

查找下一个分量并且进行检测}

While (A[i]

j:=j+1;

If A[j]=c then search:=j {在数组A中找到等于c的分量,且此分量的下标为j}

else Search:=0; {在数组中找不到等于c的分量}

End;

容易看出,在最坏的情况下,这个算法要检测A的所有m个分量才能判断在A中找不到等于c的分量。

解决问题1的另一个算法利用到已知条件中A已排好序的性质。它首先拿A 的中间分量A[m/2]与c比较,如果A[m/2]=c则解已找到。如果A[m/2]>c,则c 只可能在A[1],A[2],..,A[m/2-1]之中,因而下一步只要在A[1], A[2], .. ,A[m/2-1]中继续查找;如果A[m/2]

这个新算法因为有反复把供查找的数组分成两半,然后在其中一半继续查找的特征,我们称为二分查找算法。它可以用函数B_Search来表达:Function B_Search ( c: integer):integer;

Var

L,U,I:integer;{U和L分别是要查找的数组的下标的上界和下界}

Found:boolean;

Begin

L:=1; U:=m; {初始化数组下标的上下界}

Found:=false; {当前要查找的范围是A[L]..A[U]。}

{当等于c的分量还没有找到且U>=L时,继续查找}

While (not Found) and (U>=L) do

Begin

I:=(U+L) div 2;{找数组的中间分量}

If c=A[I] then Found:=Ture

else if c>A[I] then L:=I+1

else U:=I-1;

End;

If Found then B_Search:=1

else B_Search:=0;

End;

容易理解,在最坏的情况下最多只要测A中的k+1(k=logm,这里的log以2为底,下同)个分量,就判断c是否在A中。

算法Search和B_Search解决的是同一个问题,但在最坏的情况下(所给定的c不在A中),两个算法所需要检测的分量个数却大不相同,前者要m=2 k 个,后者只要k+1个。可见算法B_Search比算法Search高效得多。

以上例子说明:解同一个问题,算法不同,则计算的工作量也不同,所需的计算时间随之不同,即复杂性不同。

上图是运行这两种算法的时间曲线。该图表明,当m适当大(m>m0)时,算法B_Search比算法Search省时,而且当m更大时,节省的时间急剧增加。

不过,应该指出:用实例的运行时间来度量算法的时间复杂性并不合适,因为这个实例时间与运行该算法的实际计算机性能有关。换句话说,这个实例时间不单纯反映算法的效率而是反映包括运行该算法的计算机在内的综合效率。我们引入算法复杂性的概念是为了比较解决同一个问题的不同算法的效率,而不想去比较运行该算法的计算机的性能。因而,不应该取算法运行的实例时间作为算法复杂性的尺度。我们希望,尽量单纯地反映作为算法精髓的计算方法本身的效率,而且在不实际运行该算法的情况下就能分析出它所需要的时间和空间。

相关文档
最新文档