一、问题描述
在12个外观完全相同的小球中,有一个与其它球重量不同。如何只用一架天平找到这个球并判断它比其它球轻还是重?最少需要称几次?39个球呢?
二、问题分析
这是一个很经典的信息论问题,最开始的思路是用分组称重的方法,发现每次测量的次数不固定,而且当球数增多时称重次数会明显增加,所以不是次数最优的方法,于是参考了网上编码的方法并做了一点调整。
一共有12个小球,每个小球都可能偏轻或偏重,共有24种可能,其信息量为 log224≈4.58bit l o g 2 24 ≈ 4.58 b i t 。利用天平进行称重,天平每次显示结果可能为左倾、右倾或平衡三种,假如出现每种情况的概率相同,则每次称重结果的信息量为 log23≈1.58bit l o g 2 3 ≈ 1.58 b i t 。 4.58bit1.58bit≈3 4.58 b i t 1.58 b i t ≈ 3 ,所以理论上3次称重可以找出质量不同的球并判断出它是偏轻还是偏重。
根据文献The Problem of the Pennies, F. J. Dyson, The Mathematical Gazette , Vol. 30, No. 291 (Oct., 1946), pp. 231-234 的证明可知,N次称重最多可以从 3N−32 3 N − 3 2 个小球中找出不同的球,当N=3时可以判断12个小球的质量。
三、算法设计
要以最少次数称重得到结果,则每次称重应获取尽可能多的信息,也就是每次天平称重结果都应包含左倾、右倾、平衡三种可能的情况。于是称重时小球应该分为三堆,特殊小球随机分布于其中一堆,选择两堆置于天平两侧。对此,可以将每个小球进行编码,每次称重时根据编码选择三分之二的小球,对称重结果进行记录,并根据每次称重结果,找出异常小球,
3.1 编码要求
由于天平结果有三种,我们选择 ‘0’,‘1’,‘2’ 三种字符对小球进行编码,12个小球三次可以测出,因此每个小球由三位编码构成,编码应满足以下三个条件:
- 编码互不相同;
保证编码唯一性,每个编码对应唯一小球。 - 编码每一位均含有4个‘0’,‘1’,‘2’;
例如12个小球对应12个编码,这12个编码的第一位中‘0’,‘1’,‘2’各出现四次,第二第三位同理。目的是为了保证每次称重小球均分为三份。 - 每个小球编码对其中的‘0’,‘1’同时取反后,反编码不存在于已编好的序列中。
取反指编码中的‘0’变为‘1’,‘1’变为‘0’。结合前两条,该条件可以保证每个小球至少上一次天平,同时保证根据结果能够正确找出异常小球。
下一节将具体介绍这样编码的原因,以及利用这些编码称重的过程。
3.2 称重方法
每次称重天平结果有左倾、右倾、平衡三种,因此需要三种字符对小球进行编码,这里使用 ‘0’,‘1’,‘2’ ;12个球需要称重三次,则每个编码用三位字符表示。根据小球编码判断每次称重时该小球的位置。第 i i 次称重,选择编码第 位为‘0’的小球置于左盘,第 i i 位为‘1’的小球置于右盘,记录天平结果并生成结果序列,为了保证每次称重左右两盘球数相同,编码序列每一位应均包含相同个个数的‘0’,‘1’,‘2’。我们用 表示重球序列, light l i g h t 表示轻球序列,序列生成规则如下:
天平结果 | 可能原因 | 处理方式 |
左倾 | 左盘含有重球 | heavyi=0 h e |