减治法解决假币问题

识别假币问题:在n枚外观相同的假币中,有一枚是假币。在一架天平上,我们可以比较任意两组假币。也就是说,通过观察天平是向右倾、向左倾还是停在当中,我们可以判断出两组硬币重量是否相同,或者哪一组比另一组更重,但是我们不知道重多少。问题是:设计一种有效的算法来检测出这枚假币。

简化版本:已知假币相对真币较轻或者较重;
普通版本:不知道假币轻还是重
除了每次把硬币分为2份的办法,还可以用更加高效的把硬币分为三堆,每堆n/3个硬币,在比较了两堆硬币的重量之后我们可以把实例的规模小区一个因子3. 相应的,我们可以期望称重的次数大约会是log3 n

设计一种可以处理任何是或不是3的倍数个硬币的算法

伪代码如下:
每次平均分三堆的结果可能有:余数0 余数1 余数2
如果余数0:
平均分,任选两堆(堆1+堆2)比较,
如果平衡:
堆3含假币;
如果不平衡:
比较堆1和堆3,
如果平衡:
堆2含假币,
如果不平衡:
堆1含假币;

余数1:
平均分后得到3堆+1个硬币,任选两堆(堆1+堆2)比较,
如果平衡:
比较堆1和堆3,
如果平衡:
剩余的单个硬币为假,
如果不平衡:
堆3为含假币的堆
如果不平衡:
比较堆1和堆3,
如果平衡:
堆2含假币
如果不平衡:
堆1含假币

余数2:
平均分后得到3堆+1个硬币,任选两堆(堆1+堆2)比较,
如果平衡:
比较堆1和堆3
如果平衡:
假币在两个单个硬币中,这两个硬币必然是不平衡的,这时从堆中找出任意一枚硬币,从两个单个硬币中拿出硬币1进行比较
如果平衡
假币为币2
如果不平衡
假币为币1
如果不平衡:
堆3为含假币的堆
如果不平衡:
比较堆1和堆3
如果平衡:
堆2含假币
如果不平衡:
堆1含假币

分为堆1,堆2,堆3,余数k
如果堆123数目为0
if k=0
if k=1
if k=2
Else
if 堆1和堆2平衡:
if 堆1和堆3平衡,
findOutFake(k)
else
findOutFake(堆3)
else:
if 堆1和堆3平衡,
findOutFake(堆2)
else
findOutFake(堆1)

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值