- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈递归与几种搜索在程序设计中的应用暨程序设计专题训练结业论文南京航空航天大学10级计算机软件培优班041040124马晓林指导教师:刘邵翰摘要本文主要按照我的认知顺序,并结合实际应用案例分别就深度优先遍历、广度优先遍历、记忆化搜索的概念、优缺点、实现方法等简单的谈了自己的理解,并将几种算法进行了比较。关键词递归图论 搜索效率 算法优化 深度优先遍历 广度优先遍历 重复字问题记忆化搜索动态规划浅谈递归与搜索在程序设计中的应用暨程序设计专题训练结业论文本学期的程序设计算法专题训练主要集中在递归递推算法的使用,并以此为基础对深度搜索、广度搜索、动态规划以及记忆化搜索进行了一定的研究。下面我将按照我对这一系列算法的认知先后顺序谈谈我对它们的理解。在这门课最开始,我们首先更加深入的理解了递归算法运行背后的原理和关于图论的基本知识。我认为这两部分知识是之后学习的基础,意义十分重大。首先,如深度、广度搜索等算法是完全基于递归而完成的,所以只有掌握好递归才能真正学好这门课。而对于谈到图论,由于这是一门深奥广博的学科,而我们仅仅学到了皮毛的皮毛,我在这里也就不再累述,我仅仅在这里重申,在今后解决问题的过程中,我们大多需要将问题转化成图,然后再通过各种算法加以解决。下面我将通过实际应用案例(你在哪、N皇后问题、迷宫问题、最长子序列问题)分别就深度优先遍历、广度优先遍历、记忆化搜索简单的谈一下自己的理解。其中,由于老师在上课时已经比较详细、清晰的讲解过深度优先遍历与广度优先遍历,所以在此仅简单介绍。而对于上课未曾系统提及的记忆化搜索,我将进行较为详细的阐述。深度优先遍历深度优先遍历顾名思义就是优先向深处延伸的一种搜索算法,其核心是将每一个分支情况一直走到尽头而后在考虑其他分支,最终比较求得满足问题要求的解。以迷宫问题为例,本题在思路上就是自出发点开始,向不同方向的满足条件的下一个点前进,直到到达目的地为止。深搜dfs函数如下:void dfs(int i,int j,int k){int v;if (i==m j==n) printf(“可以到达指定地点\n”);else {for (v=0; v4; v++) if ( [i+dx[v],j+dy[v]该点点可以到达,并且在迷宫内dfs(i+dx[v],j+dy[v],k+1);}}注:dx和dy为代表四个行进方向的方向向量横纵坐标广度优先遍历顾名思义,广度优先遍历就是优先向同级的广度方向延伸的一种搜索算法,其核心是每次优先走同一级的分支,在同一级分支走完后在向下一级深入,最终综合的问题要求,求得结果。因为在此算法中大多使用“队列”这一概念和方法,所以该算法在处理和寻找最优解时有着DFS所无法比拟优势。仍然以迷宫问题为例,程序大体如下:head = tail = 0;while(head = tail){(x,y) = q[head];for (v=0; v4;v++){getnew(xx,yy);if (xx,yy 不重复) //判断是否存在重复情况{if (xx,yy) == 终点{输出; 结束;} tail++;(xx,yy)入队; }}head++;}综上,我们可以发现,深度优先遍历和广度优先遍历两种算法有着十分明显的优点——易于理解和实现,以上面提到的几个问题为例,只要我们能够理解题目要求并能够清晰地将递归关系以程序语言实现,那么问题基本上可以迎刃而解。但是这两种算法的缺点也是显而易见的,那就是运算量大,耗时极长。以《N皇后问题》为例,当皇后数目在8-10个时,计算机尚可较为快速的完成求解,当其规模达到13个皇后时,计算时间已经达到了近10秒,而当规模进一步扩大时,计算时间更是几何倍数的增长,于是这就对我们的算法提出了进一步优化要求。在我们进一步研究时容易发现,在这两种算法的执行过程中,由于函数递归的使用,出现了极多的重复子问题,即同一状态对应的运算结果在不同的求解过程中需要重复计算。这方面最典型的例子就是斐波那契额数列的计算过程,在计算时,我们需要计算一次=+=1+1=2,在计算时我们因为需要和的值,所以我们又需要再计算两次的值,同理当我们计算时,我们需要共计3次计算的值,计算时,调用结果的次数就达到了5次,在计算第10项、第30和第40项项时,调用的次数就分别达到了21次、317811次。可见随着下标的不断增大,对结果的调用次数将会飞速的增长。于是我们自然想到了将那些需要重复使用的中间计算结果储存下来,以便让计算机在需要调用这些结果时只需直接提取结果而不需要再次计算。这种想法就是记忆化搜索思路的核心。记忆化搜索记忆化搜索是在以上基础算法的基础上大大的进行优化的一种算法,他通过一定的方法对已经运行过的结果进行“记忆”,避免了大量
文档评论(0)