- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
递归与回溯 我们有时会碰到一些题目,它们既不能通过建立数学模型解决,又没有现成算法可以套用,或者必须遍历所有状况才可以得出正确结果。 这时,我们就必须采用搜索算法来解决问题。 搜索算法按搜索的方式分有两类,一类是深度优先搜索,一类是广度优先搜索。而对于深度优先搜索来说,我们需要使用到的一个技术就是递归与回溯。 “和最小”题目描述 设有一个长度为N的数字串,要求使用K个加号将它分成K+1个部分,找出一种分法,使得这K+1个部分的和能够为最小。 有一个数字串:312, 当N=3,K=1时会有以下两种分法: 1) 3+12=15 2) 31+2=33 这时,符合题目要求的结果是:3+12=15 递归回溯法算法框架[一] procedure Search(k:integer); Var i begin for i:=1 to 算符种数 Do if 满足条件 then begin 保存结果 if 到目的地 then 输出解 else Search(k+1); 恢复:保存结果之前的状态{回溯一步} end; end; 递归回溯法算法框架[二] procedure Search(k:integer); Var i begin if 到目的地 then 输出解 else for i:=1 to 算符种数 Do if 满足条件 then begin 保存结果 Search(k+1,参数表); 恢复:保存结果之前的状态{回溯一步} end; end; 搜索策略 题目要求的就是在每个数字之间:或者填加号,或者什么都不填。根据这个要求,我们可以从头开始扫描整个数字串,逐个考察是否要填加号,然后检查下一个数字间的位置,直到最后一个数字。 下面是一个例子和它的状态树 数字7629需要插入2个加号 这是一棵完整的搜索树。 结点内表示当前处理的状态,每向后处理一个空位即深入一层。 我们可以看到,在最后的所有叶子结点中,有三个黄色的结点是满足条件的。 7+6+2+9 7 7+6 76 7+6+2 7+62 76+2 762 7+62+9 7+629 76+2+9 76+29 7629 762+9 7+6+29 7和6之间不添加加号 7和6之间添加一个加号 迷宫问题 给出一个迷宫的地图,有一些格子中有障碍,问从起点到终点的最短路径,并输出所有的最短路径。 回溯法解题思路 1、?这个方向有路可走,我没走过,?往这个方向前进 2、?是死胡同,往回走,回到上一个路口 3、?重复第一步,直到找着出口 但是 回溯法的缺点暴露无遗: 搜索耗时极巨,无法忍受。 那么 我们可否提前判断我们前进的方向是否可能得到最优解呢?如果可以的话,搜索效率岂不是能够提高了吗 答案就是: 剪枝! 关于剪枝 剪枝的概念,其实就跟走迷宫避开死胡同差不多.。若我们把搜索的过程看成是对一棵树的遍历,那么剪枝顾名思义,就是将树中的一些“死胡同”,不能到达我们需要的解的枝条“剪”掉,以减少搜索的时间。 搜索算法,绝大部分需要用到剪枝。 然而,不是所有的枝条都可以剪掉,这就需要通过设计出合理的判断方法,以决定某一分支的取舍。 在设计判断剪枝条件的时候,就需要有一定的方法。? 最优性剪枝 又称为上下界剪枝 一种重要的搜索剪枝策略 记录当前得到的最优值 如果当前结点已经无法产生比当前最优解更优的解时,可以提前回溯 回到加号题 儿子结点的数一定比父亲大 即搜索树深度越深得到的解越大 满足最优性剪枝的条件 我们可以记录当前得到的解的最小值 如果当前得到的和值已经超过保存的最小解,即不必再继续深入搜索,回溯。 再看搜索树 我们可以看到红色结点的子节点不可能有最优解 7 7+6 76 7+6+2 7+62 76+2 762 7+62+9 7+629 76+2+9 76+29 7629 762+9 7+6+2+9 7+6+29 最优性剪枝结果 结点数大大减少。 7 7+6 76 7+6+2 7+62 7+6+2+9 7+6+29 可行性剪枝 除最优性剪枝外,另一种重要的搜索剪枝策略 判断继续搜索能否得出答案,如果不能直接回溯 再看搜索树 对于图中蓝色结点。后面能够插入’+’的位置已经少于未用完’+’的数量,肯定不可能有解。 对于这种结点,其子节点不可能有解,可以回溯。 这个节点的加号不可能有解,可以进行可行性剪枝 7 7+6 7
文档评论(0)