- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
计算理论与算法12年CH2分治
1.7 对偶与范式 CH2 分治法 分治法的抽象过程 分治法的适用条件 方法二: 迭代法 课堂练习 答案 课堂练习 用分治法求n个元素集合S中的最大、最小元素。写出算法,并分析时间复杂性(比较次数)。 假设n=3m。要求每次平分成3个子集。 思考题 不用(递归的)分治法求n个元素集合S中的最大、最小元素,使得 T(n)仍为 3n/2-2。 这里假设n=2m。 归并排序 前言 归并排序 前言 归并---合并两个有序的序列 归并排序 前言 归并排序(Merge Sort) 归并排序 归并排序(Merge Sort) 方法三:主定理 主定理简化版 归并排序 ?(nlogn) T(n)= aT(n/c)+bn (即x=1) 一个问题平分为两个子问题 大整数乘法 普通递归乘法的分析 设X, Y是n位二进制整数,分段表示如下: 改进的分治算法(1962年) Strassen矩阵乘法 Strassen的分治算法(1969) 快排序: 介绍 快排序(Quick Sort) 快排序—算法思想 快排序---划分过程 快排序---划分过程 算法分析 算法优化 快排序(Quick Sort) 线性时间选择问题: 求最小元素 求第2小的元素 笔试题 求第k小的元素 求第k小的元素 求第k个小的元素(选择问题) 递归树:例1 递归树 归并排序 ?(nlgn) 递归树:例2 递归树 递归树 递归树:例3 线性时间选择: 中位数引例 某公司有五个分公司依次设置在同一条铁路线的沿线A、B、C、D、E站。现在该公司希望在该铁路沿线设立一个仓库,要求该仓库离这五个站的火车行驶距离之和最小。如用数轴表示该铁路线,A、B、C、D、E各站的坐标依次为a、b、c、d、e(abcde),则经过数学计算,该仓库大致应设置在坐标 (1) 处。 (1)A. c B. (a+b+c+d+e)/5 C. (a+2b+3c+2d+e)/9 D. (a+4b+6c+4d+e)/16 【例】残缺棋盘 残缺棋盘是一个有2k×2k (k≥1)个方格的棋盘,其中恰有一个方格残缺。图中给出k=1时各种可能的残缺棋盘,其中残缺的方格用阴影表示。 ? 称作“三格板”,残缺棋盘问题就是要用这四种三格板覆盖更大的残缺棋盘。 在此覆盖中要求: 1)两个三格板不能重叠 2)三格板不能覆盖残缺方格,但必须覆盖其他所有的方格 在这种限制条件下,所需要的三格板总数为 问题分解过程: 以k=2时的问题为例,用二分法进行分解,得到如下图,用双线划分的四个k=1的棋盘。 棋盘的识别 棋盘的规模是一个必要的信息,有了这个信息,只要知道其左上角的左上角方格所在行、列就可以唯一确定一个棋盘了,残缺方格或“伪”残缺方格直接用行、列号记录。 ? tr 棋盘中左上角方格所在行。 ? tc 棋盘中左上角方格所在列。 ? dr 残缺方块所在行。 ? dl 残缺方块所在列。 ? size 棋盘的行数或列数。 数据结构设计:用二维数组board[ ][ ],模拟棋盘。覆盖残缺棋盘所需要的三格板数目为:( size2 -1 ) / 3 将这些三格板编号为1到( s i z e2-1 ) / 3。则将残缺棋盘三格板编号的存储在数组board[ ][ ]的对应位置中,这样输出数组内容就是问题的解。 Cover(int tr, int tc, int dr, int dc, int size) { if (size2) return; int t = amount ++, // 三格板的数目 s=size/2; // 子问题棋盘大小 if (dr tr + s dc tc + s) / /残缺方格位于左上棋盘 {Cover ( tr, tc, dr, dc, s); Board[tr + s - 1][tc + s] = t; // 覆盖1号三格板 Board[tr + s][tc + s - 1] = t; Board[tr + s][tc + s] = t; Cover (tr, tc+s, tr+s-1, tc+s, s); // 覆盖其余部分 Cover(tr+s, tc, tr+s, tc+s-1, s);
文档评论(0)