浅谈分治策略.ppt

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

基本思想 将原问题分解成若干子问题,然后求解子问题。子问题较原问题要容易些,由此得出原问题的解。分治策略一般递归进行,即子问题仍然可以用分治策略来处理,让最后的问题非常基本而简单。 基本步骤 一般分为三步递归进行 1.分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题; 2.解决:若子问题规模较小而容易被解决则直接求解,否则递归地解各个子问题; 3.合并:将该层递归各个子问题的解合并为原问题的解。 一般的算法设计模式 if 问题不可分then begin 直接求解; 返回问题的解; end else 将原问题分解为p1,p2….pk个子问题(一般采用二分法); for i:=1 to k do 递归解决子问题pi; 合并该层递归中所有子问题的解; 分治法所能解决的问题一般具有以下几个特征: 1.该问题的规模缩小到一定的程度就可以容易地解决; 2.该问题可以分解为若干个规模较小且基本相同的子问题。 3.利用该问题分解出的子问题的解可以合并为该问题的解; 金块问题 老板有一袋金块,将有两名最优秀的雇员每人得到其中的一块,排名第一的得到最重的那块,排名第二的雇员得到袋子中最轻的金块。假设有一台比较重量的仪器,我们希望用最少的比较次数找出最重的金块。 二分法求解 如果n=2,直接比较得到重和轻的金块。 如果n2,把这部分金块分成两个部分,分别递归求解。 回溯:分别比较两部分中最轻和最重的金块。 举例:10,8,2,4,5,3,9,1 分治过程: 比较过程: procedure gold(st,ed:integer); var k:integer; begin If ed-st1 then begin gold(st,(st+ed) div 2); gold((st+ed) div 2+1,ed); if a[st]a[(st+ed) div 2+1] then a[st]:=a[(st+ed) div 2+1]; if a[ed]a[(st+ed) div 2] then a[ed]:=a[(st+ed) div 2]; end else if a[st]a[ed] then begin k:=a[st]; a[st]:=a[ed]; a[ed]:=k; end; end; 求逆序对个数 有一实数序列A[1]、A[2] 、A[3] 、……A[n-1] 、A[n],若ij,并且A[i]A[j],则称A[i]与A[j]构成了一个逆序对,求数列A中逆序对的个数。 n≤10000。 例如,5 2 4 6 2 3 2 6,可以组成的逆序对有 (5 2),(5 4),(5 2),(5 3),(5 2), (4 2),(4 3),(4 2), (6 2),(6 3),(6 2), (3 2) 共:12个 二分法求解 记a[st,ed]的逆序对个数共有aa[st,ed], 分为两段分别求解:aa[st,(st+ed) div 2] aa[(st+ed) div 2+1,ed] 则aa[st,ed]:=aa[st,(st+ed) div 2]+ aa[(st+ed) div 2+1,ed]+ f[st,(st+ed) div 2,ed]; f[st,(st+ed) div 2,ed]为一个数取a[st,(st+ed) div 2]令一个数取自a[(st+ed) div 2+1,ed]的逆序对数目。 f[st,(st+ed) div 2,ed]的求解方法 如果a[st,(st+ed) div 2]和a[(st+ed) div 2+1,ed] 两个子序列都已排好序, 则求f[st,(st+ed) div 2,ed]时会很容易。 因为求解的过程是由小段子序列合并求解大段序列,且要求小段子序列已排好序,所以可以在程序中融入归并排序算法。 procedure merge(st,ed:integer); var i,j,k,kk:integer; begin if ed-st0 then begin merge(st,(st+ed) div 2); merge((st+ed) div 2+1,ed); aaa[st,ed]:=aaa[st,(st+ed) div 2]+aaa[(st+ed) d

文档评论(0)

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

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

1亿VIP精品文档

相关文档