回溯策略所解的一些问题往往是不能用数学公式去直接求解的.ppt

回溯策略所解的一些问题往往是不能用数学公式去直接求解的.ppt

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯策略所解的一些问题往往是不能用数学公式去直接求解的

0-1背包回溯算法说明 Maxvalue是一个递归实现的子程序,其中的主要传递参数如下: w: 项目物体的重量数组 v: 项目物体的价值数组 length_of(w): 重量数组的长度,也是最后一个物件下标,遍历循环的开始点,直到第一个元素 max_weight:背包的最大容量 x:最后的返回值,即背包中物体的价值 动态规划 计算Fibonacci数列的第n项:当项数大于2时,F(n)=F(n-1)+F(n-2) 如果计算Fibonacci数列第n项,这需要计算从第3项到第n-1项 随着n值的增大,递归解法的算法时间复杂性会按几何级数增长 这类问题的关键是子问题(sub-problem)有重叠,因而分治法并不适合于此类问题的求解 动态规划 基本思想是:如果一个较大问题可以被分解为若干个子问题,并且子问题有重叠,那么,可以将每个子问题的解存放到一个表中,然后通过查表来解决问题,减少不必要的重复计算 动态规划是20世纪50年代美国数学家Richard Bellman提出的 在这个术语中,Programming与编程没有关系,而是规划和设计的意思 动态规划解Fibonacci数列第n项 算法说明 算法递归子程序中的三个传递参数的作用分别是: a:第n项的输入参数 b:第n项的结果输出 c:计算过程中的中间结果存留数组(也就是一个线形表) 在计算过程中,每次计算的结果都保存在c数组中,出现重叠子问题时,直接到c[]数组中调取结果 动态规划的分析 要消除计算过程中的重复性过程,动态规划是比较好的选择 这也是计算机科学中,进行问题求解的重要途径之一 由于动态规划需要保存中间计算结果,势必占用较大的内存空间(这点贪心法就完全不同),但时间复杂性则会降低 这就是所谓“空间换时间“的策略 动态规划的分析 动态规划与贪心法不同的地方,它是一种最优化算法 当所有的解空间可以遍历的前提下,利用动态规划的思想保存所有可能的解 再通过比较就可以得到最优的解 实现原理非常简单,但非常实用,也是计算机科学中最常用的算法策略 请设计使用动态规划求解数字三角形 将递归算法转成非递归的实现 递归是计算机科学中非常重要的概念,其主要优点是递归的代码量比非递归的代码量少,算法可以设计的非常简洁 这是由于递归所使用的方式是函数调用 这在计算机算法实现中属于非常自然的栈结构 不需要记录位置信息,不需要添加控制语句 这些工作都由函数调用的特性自行解决 递归算法的弱点 递归算法的执行效率比一般非递归的执行效率要低 因为递归的实质既然是函数调用,而函数调用必然要进行线程栈空间的分配,记录每一次函数调用前的状态等工作,开销是比较大的 这个情况读者可以自行应用递归实现汉诺塔案例,输入不同的铁饼数,运行并观察 非递归算法的特点 非递归算法则不需要进行这些工作(线程栈空间的分配等) 因为非递归使用额外的变量记录当前所处的位置信息,以及额外的控制语句 递归与非递归调用最主要区别就是在函数调用上 递归与非递归策略思想 因此对解决某些问题时,希望用递归算法分析问题,但用非递归算法解决问题 这就需要把递归算法转换为非递归算法 递归算法转化为非递归算法 有如下三种基本方法: 通过分析,跳过分解过程,直接用循环结构的算法实现求解过程。 自己用栈模拟系统的运行栈,通过分析只保存必须保存的信息,从而用非递归算法替代递归算法 利用栈保存参数,由于栈的后进先出特性吻合递归算法的执行过程,因而可以用非递归算法替代递归算法 使用非递归方法实现汉诺塔算法 算法说明 将三个柱子分别命名为na1,na2,na3,初始状态,所有的盘子都在na1上,三个柱子按逆时针方向排列成一个圆环 其中存在一个规律,当对于规模为n的汉诺塔问题时: 1.奇数编号盘子总是移动移动到它后的第2个柱子上; 2.偶数编号的盘子总是移动移动到它的后第1个柱子上 基本算法策略的讨论 最优化和非最优化: 什么不去追求最优化的解? 因为存在一个解空间的规模问题,如果在规定时间里,可以找到所有的解,那么选出其中的最优解; 但是,如果不可能(有许多O(2n)以上时间复杂度的问题),那么,只好退而求其次,用次优解来解决问题 而贪心策略就是求次优解的常用思 基本算法策略的讨论 时间换空间(或空间换时间) 大部分递归算法编写简单,但运行的时间会随着问题规模的增长而急剧增长 而分治方法,一般要花费较多的时间将问题划分成为较小规模,增加了程序的复杂性;递归程序的非传参实现,也是如此 但较为复杂的算法,却换来几何级数的运行时间节省 基本算法策略的讨论 回溯策略所解的一些问题往往是不能用数学公式去直接求解的 它需要通过一个过程,此过程要经过若干个步骤才能完成,每一个步骤又分为若干种可能; 同时,为了完成任务,还必须遵守一些规则和约束; 对于这样一类问题,一般采

文档评论(0)

magui + 关注
实名认证
内容提供者

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

版权声明书
用户编号:8140007116000003

1亿VIP精品文档

相关文档