[工学]递归与分治策略.ppt

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

PKU1664题 放苹果 Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。 Input 第一行是测试数据的数目t(0 = t = 20)。以下每行均包含二个整数M和N,以空格分开。1=M,N=10。 Output 对输入的每组数据M和N,用一行输出相应的K。 Sample Input 1 7 3 Sample Output 8 3 2 2 3 3 1 4 2 1 5 1 1 4 3 0 5 2 0 6 1 0 7 0 0 Divide-and-Conquer 分治策略 将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模 对这些较小的实例求解(一般使用递归方法) 如果必要的话,合并这些较小问题的解,以得到原始问题的解 逆序对数 给一列数a[1],a[2],…,a[n],求其逆序对数,即有多少个逆序对i,j使得ij但是a[i]a[j]. 例: 3 4 1 6 逆序对数目为2, 分别为3 1, 4 1 逆序对数 简单的方法:两重循环,时间复杂度为O(n2) 利用归并排序 左边的逆序对 右边的逆序对 跨越两边的逆序对 最大子段和 给定由n个整数(可能为负整数)组成的序列a1,a2,…,an,求该序列形如 Sum = ai + ai+1 + … + aj (i = j) 的子段和的最大值,当所有整数均为负数时最大子段和定义为0。 例如(-2,11,-4,13,-5,-2)的最大子段和为20。 * 循环赛日程表 设计一个满足以下要求的比赛日程表: (1)每个选手必须与其他n-1个选手各赛一次; (2)每个选手一天只能赛一次; (3)循环赛一共进行n-1天。 按分治策略,将所有的选手分为两半,n个选手的比赛日程表就可以通过为n/2个选手设计的比赛日程表来决定。递归地用对选手进行分割,直到只剩下2个选手时,比赛日程表的制定就变得很简单。这时只要让这2个选手进行比赛就可以了。 1 2 3 4 5 6 7 8 2 1 4 3 6 5 8 7 3 4 1 2 7 8 5 6 4 3 2 1 8 7 6 5 5 6 7 8 1 2 3 4 6 5 8 7 2 1 4 3 7 8 5 6 3 4 1 2 8 7 6 5 4 3 2 1 * 大整数的乘法 请设计一个有效的算法,可以进行两个n位大整数的乘法运算 小学的方法:O(n2) ?效率太低 分治法: XY = ac 2n + (ad+bc) 2n/2 + bd 为了降低时间复杂度,必须减少乘法的次数。 XY = ac 2n + ((a-b)(d-c)+ac+bd) 2n/2 + bd XY = ac 2n + ((a+b)(c+d)-ac-bd) 2n/2 + bd 复杂度分析 T(n)=O(nlog3) =O(n1.59)?较大的改进 细节问题:两个XY的复杂度都是O(nlog3),但考虑到a+c,b+d可能得到m+1位的结果,使问题的规模变大,故不选择第2种方案。 * 大整数的乘法 请设计一个有效的算法,可以进行两个n位大整数的乘法运算 小学的方法:O(n2) ?效率太低 分治法: O(n1.59) ?较大的改进 更快的方法?? 如果将大整数分成更多段,用更复杂的方式把它们组合起来,将有可能得到更优的算法。 最终的,这个思想导致了快速傅利叶变换(Fast Fourier Transform)的产生。该方法也可以看作是一个复杂的分治算法。 * 棋盘覆盖 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 * 棋盘覆盖 当 k0 时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘。 特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。 * 为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1。 * 棋盘覆盖 void chessBoard(int tr, int tc, int dr, int dc, int size) { if (size == 1) return; int t = tile++, // L型骨牌号 s = size/2; // 分割棋盘 //

文档评论(0)

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

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

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档