分治策略.

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

方法2
将硬币分为8组,每组2个,每组比较一次,若发 现轻的,则为伪币。最多可能有8次比较。
方法3
分析
上述三种方法,分别需要比较18次,8次,4次, 那么形成比较次数差异的根据原因在哪里? 方法1:每枚硬币都至少进行了一次比较,而 有一枚硬币进行了15次比较 方法2:每一枚硬币只进行了一次比较 方法3:将硬币分为两组后一次比较可以将 硬币的范围缩小到了原来的一半,这样充分 地利用了只有1枚伪币的基本性质。
归并过程
procedure Merge(var A: ListType; P, Q, R: Integer); {将A[P..Q]和A[Q+1..R],合并到序列A[P..R]} var I, J, {左右子序列指针} T: Integer; {合并后的序列的指针} Lt: ListType; {暂存合并的序列} begin T:= P; I := P; J := Q + 1; while T <= R do begin{合并未完成} if (I <= Q) and ((J > R) or (A[I] <= A[J])) then begin Lt[t] := A[I]; Inc(I); end else begin {否则右序列的首元素进入合并序列} Lt[t] := A[J]; Inc(J); end; Inc(T); {合并后的序列的指针右移} end; A := Lt; {合并后的序列赋给A} end;
问题1:找出伪币
给你一个装有1 6枚硬币的袋子。1 6枚硬币中有 一个是伪造的,并且那个伪造的硬币比真的硬币 要轻一些。你的任务是找出这枚伪造的硬币。 为了帮助你完成这一任务,将提供一台可用来比 较两组硬币重量的仪器,比如天平。利用这台仪 器,可以知道两组硬币的重量是否相同。
方法1
任意取1枚硬币,与其他硬币进行比较,若发现 轻者,这那枚为伪币。最多可能有15次比较。
找金块的示例图
方法2:
n≤2,识别出最重和最轻的金块,一次比较就足够 了。 n>2,第一步,把这袋金块平分成两个小袋A和B。 第二步,分别找出在A和B中最重和最轻的金块。 设A中最重和最轻的金块分别为HA 与LA,以此 类推,B中最重和最轻的金块分别为HB 和LB。 第三步,通过比较HA 和HB,可以找到所有金块 中最重的;通过比较LA 和LB,可以找到所有金 块中最轻的。在第二步中,若n>2,则递归地应 用分而治之方法。
可对上述改进少1次
max:=a[1]; for i:=2 to n do {n-1次比较,从n个元素中找到最大的} if a[i]>max then begin max:=a[i]; j:=i end; for i:=j+1 to n do a[i-1]:=a[i]; {去掉最大的数a[j]} min:=a[1]; for i:=2 to n-1 do {n-2次比较,从剩下的元素中找最小的} if a[i]>max then min:=a[i];
二分过程
procedure Merge_Sort(var A: ListType; P, R: Integer); var Q: Integer; begin if P <> R then begin {若子序列A中不止一个元素} Q := (P + R - 1) div 2; {计算中间下标Q} Merge_Sort(A, P, Q); {继续对左子序列递归排序} Merge_Sort(A, Q + 1, R); {继续对右子序列递归排序} Merge(A, P, Q, R) {对左右子序列归并} end; end;
方法1
假设袋中有n 个金块。可以用函数M a x通过n-1次 比较找到最重的金块。找到最重的金块后,可以从 余下的n-1个金块中用类似的方法通过n-2次比较找 出最轻的金块。这样,比较的总次数为2n-3。 算法如下:
max:=a[1];min:=a[1]; for i:=2 to n do {2n-2次比较} begin if a[i]>max then max:=a[i]; if a[i]<min then min:=a[i]; end ;
分治策略的解题思路
if 问题不可分then begin 直接求解; 返回问题的解; end else begin 对原问题进行分治; 递归对每一个分治的部分求解 归并整个问题,得出全问题的解; end;
问题3: 归并排序
已知某数列存储在序列A[1],A[2],……,A[n], 现需要采用分治策略对他们进行从大到小(从小 到大)进行排。 例如: 52462326 排序后为 66543222
问题2:金块问题
有一个老板有一袋金块。每个月将有两名雇员会 因其优异的表现分别被奖励一个金块。按规矩, 排名第一的雇员将得到袋中最重的金块,排名第 二的雇员将得到袋中最轻的金块。根据这种方式, 除非有新的金块加入袋中,否则第一名雇员所得 到的金块总是比第二名雇员所得到的金块重。如 果有新的金块周期性的加入袋中,则每个月都必 须找出最轻和最重的金块。假设有一台比较重量 的仪器,我们希望用最少的比较次数找出最轻和 最重的金块。
分治思想
所谓分治,就字面意思而言,就是分而治之,将一个问题 分解成为若干个与原有问题相似但规模较小的子问题,然 后递归的求解这些子问题,最后合并这些子问题的结果就 得到原问题的解了。可以用很简单的话来形容分治:“大 事化小,小事化了”。 有将问题一分为二,也有将问题一分为三或一分为N等份。 对每一等份分别进行解决后,原问题就可以很快得以解决。 因此一个问题能否用分治法解决,关键是看该问题是否能 将原问题分成n个规模较小而结构与原问题相似的子问题。 递归的解决这些子问题,然后合并其结果就得到原问题的 解。 当n=2时的分治法又称二分法。
分治过程
比较过程
Байду номын сангаас 分析
从图例可以看出,当有8个金块的时候,方法1需 要比较15-16次,方法2只需要比较10次,那么形成 比较次数差异的根据原因在哪里? 其根本原因在于方法2对金块实行了分组比较。 对于N枚金块,我可以推出比较次数的公式: 假设n是2的次幂,c(n)为所需要的比较次数。 方法1: c(n)=2n-1 方法2:c(n) = 2c(n/2 ) + 2。 由c(2)=1, 使用迭代方法可知c(n) = 3n/2 - 2。在本 例中,使用方法2比方法1少用了2 5%的比较次数。
相关文档
最新文档