- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
other_____分治策略-朱全民
分治算法教案
长沙市雅礼中学 朱全民
问题1:找出伪币
给你一个装有1 6枚硬币的袋子。1 6枚硬币中有
一个是伪造的,并且那个伪造的硬币比真的硬币
要轻一些。你的任务是找出这枚伪造的硬币。
为了帮助你完成这一任务,将提供一台可用来比
较两组硬币重量的仪器,比如天平。利用这台仪
器,可以知道两组硬币的重量是否相同。
方法1
任意取1枚硬币,与其他硬币进行比较,若发现
轻者,这那枚为伪币。最多可能有15次比较。
方法2
将硬币分为8组,每组2个,每组比较一次,若发
现轻的,则为伪币。最多可能有8次比较。
方法3
分析
上述三种方法,分别需要比较15次,8次,4次,
那么形成比较次数差异的根本原因在哪里?
方法1:每枚硬币都至少进行了一次比较,而
有一枚硬币进行了15次比较
方法2:每一枚硬币只进行了一次比较
方法3:将硬币分为两组后一次比较可以将
硬币的范围缩小到了原来的一半,这样充分
地利用了只有1枚伪币的基本性质。
问题2 :金块问题
有一个老板有一袋金块。每个月将有两名雇员会
因其优异的表现分别被奖励一个金块。按规矩,
排名第一的雇员将得到袋中最重的金块,排名第
二的雇员将得到袋中最轻的金块。根据这种方式,
除非有新的金块加入袋中,否则第一名雇员所得
到的金块总是比第二名雇员所得到的金块重。如
果有新的金块周期性的加入袋中,则每个月都必
须找出最轻和最重的金块。假设有一台比较重量
的仪器,我们希望用最少的比较次数找出最轻和
最重的金块。
方法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 ;
可对上述改进少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];
找金块的示例图
方法2 :
n≤2,识别出最重和最轻的金块,一次比较就足够
了。
n>2,第一步,把这袋金块平分成两个小袋A和B。
第二步,分别找出在A和B中最重和最轻的金块。
设A 中最重和最轻的金块分别为HA 与LA,以此
类推,B中最重和最轻的金块分别为HB 和LB。
第三步,通过比较HA 和HB,可以找到所有金块
中最重的;通过比较LA 和LB,可以找到所有金
块中最轻的。在第二步中,若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 %的比较次数。
证明
令n=2k
K K-1
C(2 )=2C(2 )+2
K-2
原创力文档


文档评论(0)