现代大学计算机基础第5章算法思维与程序的设计基础.pptVIP

现代大学计算机基础第5章算法思维与程序的设计基础.ppt

  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文档。上传文档
查看更多
现代大学计算机基础第5章算法思维与程序的设计基础.ppt

5.3.5 迷途知返—回溯法   1.回溯法所能解决的问题特征   可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,…,xn)组成的一个状态空间E={(x1,x2,…,xn)∣xi∈Si,i=1,2,…,n},给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域,且|Si|有限,i=1,2,…,n。我们称E中满足D的全部约束条件的任一n元组为问题P的一个解。   我们发现,对于许多问题,所给定的约束集D具有完备性,即i元组(x1,x2,…,xi)满足D中仅涉及x1,x2,…,xi的所有约束意味着j(j=i)元组(x1,x2,…,xj)一定也满足d中仅涉及x1,x2,…,xj的所有约束,其中i=1,2,…,n。换句话说,只要存在0≤j≤n-1,使得(x1,x2,…,xj)违反d中仅涉及x1,x2,…,xj的约束之一,则以(x1,x2,…,xj)为前缀的任何n元组(x1,x2,…,xj,xj+1,…,xn)一定也违反d中仅涉及x1,x2,…,xi的一个约束(j≤i≤n)。因此,对于约束集d具有完备性的问题P,一旦检测断定某个j元组(x1,x2,…,xj)违反d中仅涉及x1,x2,…,xj的一个约束,就可以肯定,以(x1,x2,…,xj)为前缀的任何n元组 (x1,x2,…,xj,xj+1,…,xn)都不会是问题P的解,因而就不必去搜索、检测它们。回溯法正是针对这类问题,利用这类问题的上述性质而提出的比枚举法效率更高的算法。   2.回溯法的基本要素   (1) 约束条件:包括隐性的和显性的,显约束指对问题的解的取值范围限定,隐约束指为满足问题的解而对不同分量之间施加的约束。   (2) 解空间:对于问题的一个实例,解向量满足显约束的所有n元组构成该实例的一个解空间。为了搜索方便,一般用树或图的形式将问题的解空间有效地组织起来,称为状态树,它是构造深度搜索过程的依据,整个搜索以此树展开。 注意:同一个问题的显约束可能有多种,相应解空间的大小就会不同,通常情况下,解空间越小,算法的搜索效率越高。   2) 求解各个子问题   如何对各个子问题进行求解呢?由于采用分治法求解的问题被分解为若干个规模较小的相同子问题,各个子问题的解法与原问题的解法是相同的,因此,可以采用递归技术对各个子问题进行求解。在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而规模不断缩小,最终使子问题缩小到很容易解决的程度,这导致递归过程的产生。分治与递归经常同时用在算法设计中,有时,递归也可以采用循环来实现。   3) 合并   合并对分治法的性能至关重要,算法的有效性很大程度上依赖于合并的实现。   3.分治算法设计模式   其中p(n)表示一个规模为n的问题p,可以分解成K个规模较小的子问题,这些问题相互独立,又与原来的问题结构相同。在解决子问题时,又用相同的方式对每一个问题进行进一步的分解,直到某个阈值n0为止。递归地解这些子问题,再把这些子问题的解合并起来,就得到原来问题的解。n0为一阈值,表示当问题p的规模不超过n0时,问题已容易解出,不必继续分解。Adhoc(p(n))是该分治法中的基本子算法,用于直接解小规模的问题p。因此,当p的规模不超过n0时,直接用Adhoc(p(n))求解。merge(y1,y2,…,yk)是该分治法中的合并子算法,用于将p的子问题p1,p2,…,pk的相应解合并为p的解。   例5-4 整数乘法。设X和Y都是n位二进制整数,现在要计算它们的乘积XY。我们可以用小学所学的方法来设计一个计算乘积XY的算法,但是这样做计算步骤太多,显得效率较低。如果将每2个1位数的乘法或加法看做一步运算,那么这种方法运行时间为O(n2)。下面用分治法来设计一个更有效的大整数乘积算法。   我们将n位二进制整数X和Y各分为2段,每段的长为n/2位(为简单起见, 假设n是2的幂), 由此, X=A2n/2+B, Y=C2n/2+D。这样,X和Y的乘积为 Y=(A2n/2+B)(C2n/2+D)=AC2n+(AD+CB)2n/2+BD (1)   如果按式(1)计算XY,则必须进行4次n/2位整数的乘法(AC,AD,BC和BD),以及3次不超过n位的整数加法(分别对应于式(1)中的加号),此外还要做2次移位(分别对应于式(1)中乘2n和乘2n/2),运行时间为O(n2),可见,用式(1)计算X和Y的乘积并不比小学生的方法更有效。要想改进算法的计算复杂性,必须减少乘法次数。为此把XY写成另一种形式: XY=AC2n+[(A-B)(D-C)+AC+?BD]2n/2+BD (2) 虽然式(2)来比式(1)复杂些,

文档评论(0)

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

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

1亿VIP精品文档

相关文档