04.分治法.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文档。上传文档
查看更多
04.分治法

第四章 分治法 4.1 概述 4.2 排序问题中的分治法 4.3 组合问题中的分治法 4.4 几何问题中的分治法 阅读 递归函数的执行过程 习题 4.1 概述 4.1.1 分治法的设计思想 分治法的设计思想 分治法的求解过程 划分 求解子问题 合并 问题划分时注意: 平衡子问题 独立子问题 4.1.2 一个简单的例子 【问题】输出如图4.3(a)所示NXN的数字旋转方阵。 【想法】… 【算法】… 【算法分析】… 【算法实现】… 4.2 排序问题中的分治法 归并排序和快速排序是成功应用分治法的完美例子 归并排序按照记录在序列中的位置对序列进行划分; 快速排序按照记录的值对序列进行划分; 4.2.1 归并排序 以二路归并排序为例,其分治策略是: 划分: 求解子问题: 合并: 4.3 组合问题中的分治法 阅读材料:递归函数的执行过程 分治与递归的关系 递归的定义 递归可计算出结果的两个基本要素 边界条件 递归模式 两个著名的递归实例及其算法: Fibonacci序列(Fibonacci Sequence) 汉诺塔问题(Tower of Hanoi) 习题 课内:T14 课外:… * 分治法求解棋盘覆盖问题的技巧在于划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。 k0时,可将2k×2k的棋盘划分为4个2k-1×2k-1的子棋盘,这样划分后,由于原棋盘只有一个特殊方格,所以,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。为了将这3个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种划分策略,直至将棋盘分割为1×1的子棋盘。 * 2k-1×2k-1 2k-1×2k-1 2k-1×2k-1 2k-1×2k-1 (a)棋盘分割 (b) 构造相同子问题 * 下面讨论棋盘覆盖问题中数据结构的设计。 (1)棋盘:可以用一个二维数组board[size][size]表示一个棋盘,其中,size=2k。为了在递归处理的过程中使用同一个棋盘,将数组board设为全局变量; (2)子棋盘:整个棋盘用二维数组board[size][size]表示,其中的子棋盘由棋盘左上角的下标tr、tc和棋盘大小s表示; (3)特殊方格:用board[dr][dc]表示特殊方格,dr和dc是该特殊方格在二维数组board中的下标; (4) L型骨牌:一个2k×2k的棋盘中有一个特殊方格,所以,用到L型骨牌的个数为(4k-1)/3,将所有L型骨牌从1开始连续编号,用一个全局变量t表示。 * dc dr tr tc size 棋盘覆盖问题中的数据结构 * 算法4.8——棋盘覆盖 void ChessBoard(int tr, int tc, int dr, int dc, int size) // tr和tc是棋盘左上角的下标,dr和dc是特殊方格的下标, // size是棋盘的大小,t已初始化为0 { if (size = = 1) return; //棋盘只有一个方格且是特殊方格 t++; // L型骨牌号 s = size/2; // 划分棋盘 // 覆盖左上角子棋盘 if (dr tr + s dc tc + s) // 特殊方格在左上角子棋盘中 ChessBoard(tr, tc, dr, dc, s); //递归处理子棋盘 else{ // 用 t 号L型骨牌覆盖右下角,再递归处理子棋盘 board[tr + s - 1][tc + s - 1] = t; ChessBoard(tr, tc, tr+s-1, tc+s-1, s); } * // 覆盖右上角子棋盘 if (dr tr + s dc = tc + s) // 特殊方格在右上角子棋盘中 ChessBoard(tr, tc+s, dr, dc, s); //递归处理子棋盘 else { // 用 t 号L型骨牌覆盖左下角,再递归处理子棋盘 board[tr + s - 1][tc + s] = t; ChessBoard(tr, tc+s, tr+s-1, tc+s

文档评论(0)

liangyuehong + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档