递归与分治策略讲义.pptVIP

  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文档。上传文档
查看更多
算法设计与分析 第7章 分治算法 本章主要知识点: 递归的概念 分治法的基本思想 大整数的乘法 二分搜索技术 矩阵乘法 密码学简介 递归的概念 直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。 在计算机算法设计与分析中,使用递归技术往往使函数的定义和算法的描述简洁且易于理解。 下面来看几个实例。 递归的概念 例1 阶乘函数 可递归地定义为: 其中: n=0时,n!=1为边界条件 n0时,n!=n(n-1)!为递归方程 边界条件与递归方程是递归函数的二个要素,递归函数只有具备了这两个要素,才能在有限次计算后得出结果。 递归的概念 例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55,…,被称为Fibonacci数列。它可以递归地定义为: 第n个Fibonacci数可递归地计算如下: public static int fibonacci(int n) { if (n = 1) return 1; return fibonacci(n-1)+fibonacci(n-2); } 递归的概念 Hanoi塔问题 设a,b,c是3个塔座。开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。在移动圆盘时应遵守以下移动规则: 每次只能移动1个圆盘; 任何时刻都不允许将较大的圆盘压在较小的圆盘之上; 在满足移动规则1和2的前提下,可将圆盘移至a,b,c中任一塔座上。 public static void hanoi(int n, int a, int b, int c) {  if (n 0)  {   hanoi(n-1, a, c, b);   move(a,b);   hanoi(n-1, c, b, a);  } } 思考:如果塔的个数变为a,b,c,d四个,现要将n个圆盘从a全部移动到d,移动规则不变,求移动步数最小的方案。 递归的概念 递归小结 优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。 缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。 解决方法:在递归算法中消除递归调用,使其转化为非递归算法。 分治法的基本思想 分治法的基本思想 分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。 将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。 分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。 分治法的基本思想 分治法的基本思想 分治法的适用条件 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。 例一:大整数乘法问题 用计算机进行两个大的整数相乘,会引起以下的问题: 太大的数计算机无法表示,若改用浮点数,则只能得到近似值; 如何精确地表示和计算两个大的整数相乘?编程求解 问题: 给定两个n位数的整数N1和N2(不实一般性,假设n=2k),求value=N1*N2=? 大整数乘法的分治算法思想 分?一分为二、二分为四(以n=4为例) N1=102w+x,N2=102y+z,于是: N1*N2=(102w+x)*(102*y+z) =104wy+102(wz+xy)+xz 因为r=(w+x)(y+z)=wy+(wy+xy)+xz 求出wy 、xz、和r= (w+x)(y+z) 治?合并:求和。 效率:四次n/2位的乘法,减为三次n/2的乘法。 大整数乘法算法描述 Integer dc(N1,N2,N) {  if ( N = 2) return N1*N2; //N是整数的位数值  w=left(N1,N/2); x=right(N1,N/2); y=left(N3,N/2); z=right(N3,N/2); wy=dc(w, y, N/2);

文档评论(0)

153****9595 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档