




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、浅谈递归与几种搜索在程序设计中的应用暨程序设计专题训练结业论文南京航空航天大学10级计算机软件培优班041040124马晓林指导教师:刘邵翰摘要本文主要按照我的认知顺序,并结合实际应用案例分别就深度优先遍历、广度优先遍历、记忆化搜索的概念、优缺点、实现方法等简单的谈了自己的理解,并将几种算法进行了比较。关键词递归 图论 搜索效率 算法优化 深度优先遍历 广度优先遍历 重复字问题 记忆化搜索动态规划浅谈递归与搜索在程序设计中的应用暨程序设计专题训练结业论文本学期的程序设计算法专题训练主要集中在递归递推算法的使用,并以此为基础对深度搜索、广度搜索、动态规划以及记忆化搜索进行了一定的研究。下面我将按
2、照我对这一系列算法的认知先后顺序谈谈我对它们的理解。在这门课最开始,我们首先更加深入的理解了递归算法运行背后的原理和关于图论的基本知识。我认为这两部分知识是之后学习的基础,意义十分重大。首先,如深度、广度搜索等算法是完全基于递归而完成的,所以只有掌握好递归才能真正学好这门课。而对于谈到图论,由于这是一门深奥广博的学科,而我们仅仅学到了皮毛的皮毛,我在这里也就不再累述,我仅仅在这里重申,在今后解决问题的过程中,我们大多需要将问题转化成图,然后再通过各种算法加以解决。下面我将通过实际应用案例(你在哪、N皇后问题、迷宫问题、最长子序列问题)分别就深度优先遍历、广度优先遍历、记忆化搜索简单的谈一下自己
3、的理解。其中,由于老师在上课时已经比较详细、清晰的讲解过深度优先遍历与广度优先遍历,所以在此仅简单介绍。而对于上课未曾系统提及的记忆化搜索,我将进行较为详细的阐述。深度优先遍历深度优先遍历顾名思义就是优先向深处延伸的一种搜索算法,其核心是将每一个分支情况一直走到尽头而后在考虑其他分支,最终比较求得满足问题要求的解。以迷宫问题为例,本题在思路上就是自出发点开始,向不同方向的满足条件的下一个点前进,直到到达目的地为止。深搜dfs函数如下:void dfs(int i,int j,int k) int v; if (i=m && j=n) printf(“可以到达指定地点n”); e
4、lse for (v=0; v<4; v+) if ( i+dxv,j+dyv 该点点可以到达,并且在迷宫内 dfs(i+dxv,j+dyv,k+1); 注:dx和dy为代表四个行进方向的方向向量横纵坐标广度优先遍历顾名思义,广度优先遍历就是优先向同级的广度方向延伸的一种搜索算法,其核心是每次优先走同一级的分支,在同一级分支走完后在向下一级深入,最终综合的问题要求,求得结果。因为在此算法中大多使用“队列”这一概念和方法,所以该算法在处理和寻找最优解时有着DFS所无法比拟优势。仍然以迷宫问题为例,程序大体如下:head = tail = 0;while(head <= tail)(x
5、,y) = qhead;for (v=0; v<4;v+)getnew(xx,yy);if (xx,yy 不重复) /判断是否存在重复情况if (xx,yy) = 终点 输出; 结束; tail+;(xx,yy)入队; head+;综上,我们可以发现,深度优先遍历和广度优先遍历两种算法有着十分明显的优点易于理解和实现,以上面提到的几个问题为例,只要我们能够理解题目要求并能够清晰地将递归关系以程序语言实现,那么问题基本上可以迎刃而解。但是这两种算法的缺点也是显而易见的,那就是运算量大,耗时极长。以N皇后问题为例,当皇后数目在8-10个时,计算机尚可较为快速的完成求解,当其规模达到13个皇后
6、时,计算时间已经达到了近10秒,而当规模进一步扩大时,计算时间更是几何倍数的增长,于是这就对我们的算法提出了进一步优化要求。在我们进一步研究时容易发现,在这两种算法的执行过程中,由于函数递归的使用,出现了极多的重复子问题,即同一状态对应的运算结果在不同的求解过程中需要重复计算。这方面最典型的例子就是斐波那契额数列的计算过程,在计算a4时,我们需要计算一次a3=a2+a1=1+1=2,在计算a5时我们因为需要a4和a3的值,所以我们又需要再计算两次a3的值,同理当我们计算a6时,我们需要共计3次计算a3的值,计算a7时,调用结果的次数就达到了5次,在计算第10项、第30和第40项项时,调用a3的
7、次数就分别达到了21次、317811次和39088169次。可见随着下标的不断增大,对a3结果的调用次数将会飞速的增长。于是我们自然想到了将那些需要重复使用的中间计算结果储存下来,以便让计算机在需要调用这些结果时只需直接提取结果而不需要再次计算。这种想法就是记忆化搜索思路的核心。记忆化搜索记忆化搜索是在以上基础算法的基础上大大的进行优化的一种算法,他通过一定的方法对已经运行过的结果进行“记忆”,避免了大量的重复计算,从而数以亿计倍的极大程度的减小了程序的计算规模,缩短了运行时间,应用价值十分重大。如上文所述,该算法核心是将需要多次使用的中间计算结果储存在一个专门的数组中,在每次计算时先在该数组
8、中对该结果进行搜索,若能够找到则直接调用储存的结果。 以N皇后问题为例,在解题过程中,当计算13皇后问题时,在线评判系统会判定其计算超时。但是当我们使用动态规划对改程序进行一定改进时,问题就迎刃而解了。先举一个简单的例子来说明记忆化方法对提高递归函数运算效率的巨大作用。仍然是计算斐波那契额数列,其求解函数fun如下:int f1000=0; /用于存放已经求出的结果int fun(int n)int x;if (fx!=0) return fx;if(n=1|n=2)x=1;elsex=fun(n-1)+fun(n-2);fn=x; return x;显然,以上函数对于数列中具有相同下标的项仅
9、仅进行了一次求解,这就极大的提高了运算效率。实践证明,在求解a240时该方法的运算时间仅仅是普通递归的百亿分之一数量级。刚刚的斐波那契额数列求解仅仅是使用了记忆化方法,并没有体现其再搜索中的应用,所以并不能算作是记忆化搜索。那么下面请看一个较为复杂的真正的记忆化搜索案例:求解最长公共子序列问题。其主要递归函数calc如下:int a10001000int calc(int i, int j) int x = 0;if (aij != 0) return (aij);if (i=0 | j=0) return 0;x = max(calc(i - 1, j), x);x = max(calc(i, j - 1), x);if (str1i-1 = str2j-1) x = max(calc(i - 1, j - 1) + 1, x);aij = x;return x;虽然记忆化搜索在计算时间和计算效率上相对于一般的算法有了巨大飞跃,但是考虑到其执行过
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 渝北石纹地板施工方案
- 碑林区高一联考数学试卷
- 鼓楼区楼道出新施工方案
- 电厂排灰委托运行施工方案
- 楼梯间踢脚线粉墙施工方案
- 2025年大数据展现平台合作协议书
- 数控加工工艺与编程技术基础 教案 模块二 项目二 综合件的加工(3-4)
- 加强农田基础设施建设实施方案
- 挥发性有机物排放控制的法律法规及政策要求
- 强化基本医疗卫生服务的策略及实施路径
- 农业土壤改良技术手册
- DG∕TJ 08-89-2016 空间格构结构工程质量检验及评定标准
- 巨量千川营销师(初级)认证考试题(附答案)
- DLT5210.1-电力建设施工质量验收及评价规程全套验评表格之欧阳法创编
- (2024)湖北省公务员考试《行测》真题及答案解析
- 安全技术管理专业毕业实习报告范文
- 《法官检察官》课件
- 四年级全一册《劳动与技术》第一单元活动4《规范使用家用电器》课件
- 2024年度网易游戏开发与发行合同6篇
- 2025届高考语文复习:文言文阅读方法指导+课件
- 温州市第五届职业技能大赛砌筑工项目比赛技术文件
评论
0/150
提交评论