- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Chapter-03-递归与分治策略.ppt
采用分治算法解决棋盘覆盖问题的数据结构 令size=2k ,表示棋盘的规格。 棋盘:使用二维数组表示: int board[1025][1025]; 为了方便递归调用,将数组board设为全局变量。board[0][0]是棋盘的左上角方格。 子棋盘:由棋盘左上角的坐标tr,tc和棋盘大小s表示。 特殊方格:在二维数组中的坐标位置是(dr,dc)。 L型骨牌:用到的L型骨牌个数为(4k-1)/3 ,将所有L型骨牌从1开始连续编号,用一个全局变量表示: static int tile=1; * 棋盘覆盖问题的分治算法 3.2.6 选择问题 对于给定的n个元素的数组a[0:n—1],要求从中找出第k小的元素。 输入 输入有多组测试例。 对每一个测试例有2行,第一行是整数n和k(1≤k<n≤1000),第二行是n个整数。 输出 第k小的元素。 * 输入样例 输出样例 5 2 3 9 4 1 6 7 3 4 59 7 23 61 55 46 3 23 3.2.6 选择问题 一种简单的解决方法就是对全部数据进行排序,于是得到问题的解。 但即使用较好的排序方法,算法的复杂性也为nlogn 。 快速排序算法是分治策略的典型应用,不过不是对问题进行等份分解(二分法),而是通过分界数据(支点)将问题分解成独立的子问题。 * 3.2.6 选择问题 首先选第一个数作为分界数据,将比它小的数据存储在它的左边,比它大的数据存储在它的右边,它存储在左、右两个子集之间。这样左、右子集就是原问题分解后的独立子问题。 再用同样的方法,继续解决这些子问题,直到每个子集只有一个数据,就完成了全部数据的排序工作。 * 3.2.6 选择问题 利用快速排序算法的思想,来解决选择问题。 记一趟快速排序后,分解出左子集中元素个数为 nleft,则选择问题可能是以下几种情况之一: nleft =k﹣1,则分界数据就是选择问题的答案。 nleft >k﹣1,则选择问题的答案继续在左子集中找,问题规模变小了。 nleft <k﹣1,则选择问题的答案继续在右子集中找,问题变为选择第k-nleft-1 小的数,问题的规模变小了。 * 输入样例 输出样例 5 2 3 9 4 1 6 3 此算法在最坏情况时间复杂度为 O(n2) ,此时nleft总是为0,左子集为空,即第k小元素总是位于right子集中。 平均时间复杂度为 O(n )。 1 3 9 4 6 * 算法3.9 采用分治策略找出第K小元素的算法 i=1 j=3 3 1 4 9 6 i=2 j=1 j=1 left=0 3 输入样例 输出样例 5 2 3 9 4 1 6 3 do…while语句: 当条件为true时继续循环的处理过程 ≥ 3 9 4 1 6 left right i j pivot 3 9 4 1 6 left right i j pivot 3.2.7输油管道问题 某石油公司计划建造一条由东向西的主输油管道。该管道要穿过一个有n口油井的油田。从每口油井都要有一条输油管道沿最短路经(或南或北)与主管道相连。 如果给定n口油井的位置,即它们的x坐标(东西向)和y坐标(南北向),应如何确定主管道的最优位置,即使各油井到主管道之间的输油管道长度总和最小的位置? 给定n口油井的位置,编程计算各油井到主管道之间的输油管道最小长度总和。 * 3.2.7输油管道问题 输入 第1行是一个整数n,表示油井的数量(1≤n≤10 000)。 接下来n行是油井的位置,每行两个整数x和y (﹣10 000≤x,y≤10 000)。 输出 各油井到主管道之间的输油管道最小长度总和。 * 输入样例 5 1 2 2 2 1 3 3 -2 3 3 输出样例 6 3.2.7输油管道问题 设n口油井的位置分别为 ,i=1~n。由于主输油管道是东西向的,因此可用其主轴线的y坐标唯一确定其位置。主管道的最优位置y应该满足: 由中位数定理可知,y是中位数。 * 输入样例 5 1 2 2 2 1 3 3 -2 3 3 输出样例 6 算法1:对数组A排序(一般是升序),取中间的元素 int n; //油井的数量 int x; //x坐标,读取后丢弃 int a[1000]; //y坐标 cinn; for(int k=0;kn;k++) cinxa[k]; sort(a,a+n); //按升序排序 //计算各油井到主管道之间的输油管道最小长度总和 int min=0; for(int i=0;in;i++) min += (int)fabs(a[i]-a[n/2]); coutminendl; * 算法2:采用分治策略求中位数 int n; //油井的数量 int x;
文档评论(0)