分冶策略生成PDF.docx
- 文档编号:29362005
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:24
- 大小:66.05KB
分冶策略生成PDF.docx
《分冶策略生成PDF.docx》由会员分享,可在线阅读,更多相关《分冶策略生成PDF.docx(24页珍藏版)》请在冰豆网上搜索。
分冶策略生成PDF
分治策略(DivideandConquer)
一、算法思想
任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。
问题规模越小,解题所需的计算时间往往也越少,从而也越容易计算。
想解决一个较大的问题,有时是相当困难的。
分治法的思想就是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
分而治之方法与软件设计的模块化方法非常相似。
为了解决一个大的问题,可以:
1)把它分成两个或多个更小的问题;2)分别解决每个小问题;3)把各小问题的解答组合起来,即可得到原问题的解答。
小问题通常与原问题相似,可以递归地使用分而治之策略来解决。
1、解决算法实现的同时,需要估算算法实现所需时间。
分治算法时间是这样确定的:
解决子问题所需的工作总量(由子问题的个数、解决每个子问题的工作量决定)合并所有子问题所需的工作量。
2、分治法是把任意大小问题尽可能地等分成两个子问题的递归算法
3、分治的具体过程:
begin {开始}
if①问题不可分then②返回问题解
elsebegin
③从原问题中划出含一半运算对象的子问题1;
④递归调用分治法过程,求出解1;
⑤从原问题中划出含另一半运算对象的子问题2;
⑥递归调用分治法过程,求出解2;
⑦将解1、解2组合成整修问题的解;
end;
end;{结束}
二、分治策略的应用
(1)找出伪币
给你一个装有16个硬币的袋子。
16个硬币中有一个是伪造的,并且那个伪造的硬币比真的硬币要轻一些。
你的任务是找出这个伪造的硬币。
[问题简析]为了帮助你完成这一任务,将提供一台可用来比较两组硬币重量的仪器,利用这台仪器,可以知道两组硬币的重量是否相同。
比较硬币1与硬币2的重量。
假如硬币1比硬币2轻,则硬币1是伪造的;假如硬币2比硬币1轻,则硬币2是伪造的。
这样就完成了任务。
假如两硬币重量相等,则比较硬币3和硬币4。
同样,假如有一个硬币轻一些,则寻找伪币的任务完成。
假如两硬币重量相等,则继续比较硬币5和硬币6。
按照这种方式,可以最多通过8次比较来判断伪币的存在并找出这一伪币。
另外一种方法就是利用分而治之方法。
假如把16硬币的例子看成一个大的问题。
第一步,把这一问题分成两个小问题。
随机选择8个硬币作为第一组称为A组,剩下的8个硬币作为第二组称为B组。
这样,就把16个硬币的问题分成两个8硬币的问题来解决。
第二步,判断A和B组中是否有伪币。
可以利用仪器来比较A组硬币和B组硬币的重量。
假如两组硬币重量相等,则可以判断伪币不存在。
假如两组硬币重量不相等,则存在伪币,并且可以判断它位于较轻的那一组硬币中。
最后,在第三步中,用第二步的结果得出原先16个硬币问题的答案。
若仅仅判断硬币是否存在,则第三步非常简单。
无论A组还是B组中有伪币,都可以推断这16个硬币中存在伪币。
因此,仅仅通过一次重量的比较,就可以判断伪币是否存在。
现在假设需要识别出这一伪币。
把两个或三个硬币的情况作为不可再分的小问题。
注意如果只有一个硬币,那么不能判断出它是否就是伪币。
在一个小问题中,通过将一个硬币分别与其他两个硬币比较,最多比较两次就可以找到伪币。
这样,16硬币的问题就被分为两个8硬币(A组和B组)的问题。
通过比较这两组硬币的重量,可以判断伪币是否存在。
如果没有伪币,则算法终止。
否则,继续划分这两组硬币来寻找伪币。
假设B是轻的那一组,因此再把它分成两组,每组有4个硬币。
称其中一组为B1,另一组为B2。
比较这两组,肯定有一组轻一些。
如果B1轻,则伪币在B1中,再将B1又分成两组,每组有两个硬币,称其中一组为B1a,另一组为B1b。
比较这两组,可以得到一个较轻的组。
由于这个组只有两个硬币,因此不必再细分。
比较组中两个硬币的重量,可以立即知道哪一个硬币轻一些。
较轻的硬币就是所要找的伪币。
(2)二分搜索(折半查找)
算法思想:
将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。
通过一次比较,将查找区间缩小一半。
折半查找是一种高效的查找方法。
它可以明显减少比较次数,提高查找效率。
但是,折半查找的先决条件是查找表中的数据元素必须有序。
算法步骤描述:
step1首先确定整个查找区间的中间位置:
mid=(left+right)/2
step2用待查关键字值与中间位置的关键字值进行比较;
●若相等,则查找成功
●若大于,则在后(右)半个区域继续进行折半查找
●若小于,则在前(左)半个区域继续进行折半查找
Step3对确定的缩小区域再按折半公式,重复上述步骤。
最后,得到结果:
要么查找成功,要么查找失败。
折半查找的存储结构采用一维数组存放。
折半查找算法举例
对给定数列(有序){3,5,11,17,21,23,28,30,32,50},按折半查找算法,查找关键字值为30的数据元素。
折半查找的算法讨论:
优点:
ASL(平均查找长度)≤log2n,即每经过一次比较,查找范围就缩小一半。
经log2n次计较就可以完成查找过程。
缺点:
因要求有序,所以要求查找数列必须有序,而对所有数据元素按大小排序是非常费时的操作。
例如:
由于数据按升序排列,故用折半查找最快捷。
programbinsearch;
constmax=10;
varnum:
array[1..max]ofinteger;
i,n:
integer;
proceduresearch(x,a,b:
integer);
varmid:
integer;
begin
ifa=bthen
ifx=num[a]thenwriteln('Found:
',a)elsewriteln('Numbernotfound')
elsebegin
mid:
=(a+b)div2;
ifx>num[mid]thensearch(x,mid,b);
ifx ifx=num[mid]thenwriteln('Found: ',mid); end; end; begin write('Pleaseinput10numbersinorder: '); fori: =1tomaxdoread(num); write('Pleaseinputthenumbertosearch: '); readln(n); search(n,1,max); end. 非递归算法: PROCEDUREBINASEARCH(A,N,K); BEGINS: =1; T: =N; I: =0; WHILES<=TDO BEGIN M: =(S+T)DIV2; IFA[M]<>KTHENIFA[M]>KTHENT: =M-1ELSES: =M+1 ELSEBEGINI: =M; S: =T+1; END END; IFI>0THENWRITELN(I,A[I])ELSEWRITELN(‘NOFOUND! ’) END; (3)循环赛日程表 有n个编号为1到n的运动员参加某项运动的单循环比赛,即每个运动员要和所有其他运动员进行一次比赛。 试为这n个运动员安排一个比赛日程,使得每个运动员每天只进行一场比赛,且整个比赛在n-1天内结束。 输入运动员人数n(n<=10000),输出一个n阶方阵A[1..N,0..N-1],当J>0时,A[1,J]表示第1名运动员在第J天的比赛对手。 【分析提示】由于N个运动员要进行单循环比赛,且在N-1天内要结束全部比赛,经过分析,当且仅当N为2的整次幂时,问题才有解,当然解是不惟一的。 这样可以将运动员分成两组: 1,2,…,N/2和N/2+1,N/2+2,…,N。 给第一组运动员安排一个比赛日程,得到一个N/2阶的方阵A1;同时给第二组的运动员安排一个比赛日程,同样会得到一个N/2阶的一个方阵A2。 考虑到比赛的性质,设定第1个运动员在某一天的比赛对手为第K个运动员,则第K个运动员在同一天的比赛对手必然是第1个运动员,即若有A[1,J]=K,则A[1,K]=I。 因此原问题的解(一个N阶方阵)可以由分解后的两个子问题的解,按下图所示形式合并起来。 同时每一个子问题又可以按照上述的二分法分解下去,直至每个组中仅有2个运动员时为止。 procedurearrangment(K,N: integer);begin ifn=2then{处理只有2名运动员的情况,递归终止条件} begin A[K,0]: =K;A[K,1]: =K+I; A[K+I,0]: =K+I;A[K+I,1]: =K; end else begin arrangment(K,Ndiv2); arrangment(K+Ndiv2,Ndiv2);{递归分解原问题与求解子问题} forI: =KtoK+(Ndiv2)-1do{合并子问题,构造原问题的解A[I,J]} forJ: =(Ndiv2)toN-1do A[I,J]: =A[I+(Ndiv2),J-(Ndiv2)]; forI: =K+(Ndiv2)toK+N-1do forJ: =(Ndiv2)toN-1do A[I,j]: =A[I-(Ndiv2),J-(Ndiv2)]; end;end; (4)在n个元素中找出最大元素和最小元素 我们可以把这n个元素放在一个数组中,用直接比较法求出。 算法如下: BEGIN MIN: =A[1]: MAX: =A[1]; FORI: =2TONDO BEGIN IFA[I]>MAXTHENMAX: =A[I];
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 策略 生成 PDF
![提示](https://static.bdocx.com/images/bang_tan.gif)