计算机算法分析与设计+++论文

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

信息技术学院

算法设计与分析课程考查论文

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

班级2007级软件工程

学号071164053

姓名邱玲

任课教师刘维群

完成日期2010年6月20日

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

0 引言

对于计算机科学来说,算法分析与设计是至关重要的。在一个大型软件系统的开发中,设计出有效的算法将起到决定性的作用。通俗的讲,算法是解决问题的一种方法。也因此,《算法分析与设计》成为计算科学的核心问题之一,也是计算机科学与技术专业本科及研究生的一门重要的专业基础课。算法分析与设计是计算机软件开发人员必修课,软件的效率和稳定性取决于软件中所采用的算法;对于一般程序员和计算机专业学生,学习算法设计与分析课程,可以开阔编程思路,编写出优质程序。通过老师的解析,培养我们怎样分析算法的“好”于“坏”,怎样设计算法,并以广泛用于计算机科学中的算法为例,对种类不同难度的算法设计进行系统的介绍与比较。本书系统地阐述了算法设计的方法、技术和应用实例。

全书内容包括基础算法、基本数据结构、基本算法设计技术、图算法、网络流和匹配、文本处理算法、数论算法、网络算法、NP完全性、近似算法、回溯法和分枝限界法、外存算法、并行算法和在线算法。Java实现示例覆盖了软件设计方法、面向对象实现问题和算法的实验性分析。这些典型问题的Java应用示例分布在不同的章节中。此外,书中以大量图例说明算法的工作过程,使算法更加易于理解和掌握。

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

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

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

不言而喻,对于任意给定的问题,设计出复杂性尽可能地的算法是我们在设计算法是追求的一个重要目标;另一方面,当给定的问题已有多种算法时,选择

其中复杂性最低者,是我们在选用算法适应遵循的一个重要准则。因此,算法的复杂性分析对算法的设计或选用有着重要的指导意义和实用价值。

关于算法的复杂性,有两个问题要弄清楚:

1.用怎样的一个量来表达一个算法的复杂性;

2.对于给定的一个算法,怎样具体计算它的复杂性。

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

比较两对算法的效率

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

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

Function Search (c:integer):integer;

Var J:integer;

Begin

J:=1; {初始化}

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

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

While (A

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更大时,节省的时间急剧增加。

不过,应该指出:用实例的运行时间来度量算法的时间复杂性并不合适,因为这个实例时间与运行该算法的实际计算机性能有关。换句话说,这个实例时间不单纯反映算法的效率而是反映包括运行该算法的计算机在内的综合效率。我们引入算法复杂性的概念是为了比较解决同。

一个问题的不同算法的效率,而不想去比较运行该算法的计算机的性能。因而,不应该取算法运行的实例时间作为算法复杂性的尺度。我们希望,尽量单纯地反映作为算法精髓的计算方法本身的效率,而且在不实际运行该算法的情况下就能分析出它所需要的时间和空间。

1.2复杂性的计量:

算法的复杂性是算法运行所需要的计算机资源的量,需要的时间资源的量称作时间复杂性,需要的空间(即存储器)资源的量称作空间复杂性。这个量应该集中反映算法中所采用的方法的效率,而从运行该算法的实际计算机中抽象出来。换句话说,这个量应该是只依赖于算法要解的问题的规模、算法的输入和算

相关文档
最新文档