作者: Phill King
邮箱: phillking1982@163.com
原创文章,转载请注明出处。
有N个外表一模一样的小球,除了有一个小球略轻或略重,其他的小球质量都是一样的。求用没砝码的天秤最少称多少次,才能找出的异常球,并且知道它是更轻还是更重?
本文介绍一种三进制(Ternary)编码的方法来解决任意数目的称球问题。
通常我们对二进制编码更为熟悉,二进制编码由0,1构成。而三进制编码由0,1,2构成。
我们先引入三进制正序数和逆序数的概念:
正序数:
从左到右第一次变化是0->1, 1->2, 2->0。 如010,201等。
逆序数:
从左到右第一次变化和正序数相反: 1->0, 2->1, 0->2。 如100,211等。
性质:
对于每一轮的称量,我们都将N个小球分成三组。同时给每个小球两个三进制编码。以12个小球为例:
第i论的称量规则:
第i次称,根据编码第i位的数值决定放置位置。0 放在左边,2放在右边。1不称。
假设六号小球是异常球:
那么根据我们的称量规则,可以根据每一轮的结果获取异常球的三进制编码。
假设6号球更重,简单分析一下过程:
1. 第一轮:6号球编码是120.第一位是1,所以放在旁边不称。第一轮的结果是平衡,记录1.
2. 第二轮:6号球第二位编码是2,放在天平的右边。6号球更重,第二轮结果是左边轻,记录2
3.第三轮:6号球第三位编码是0,放在左边。第三轮结果是左边重,记录0.
结果的编码是120,和6号球的正序数编码是一样的。如果6号球偏轻,结果是102和6号球的逆序数编码是一样的。
以上分析了12球的情况,那如果球的数目不能被3整除的时候。应该怎么做呢?
我们再引入三元组的概念:
三元组:
结合三元组的分配规则如下:
后续出现称球不平衡时,用第一次称后已知的正常球补足。
下面以8个球为例:
编码方案:
具体过程:
###代表已知的正常球。第一轮至少可以获知两个正常球。通常我们只需要一个来保证天平两侧的平衡即可。这里仍然以6号球为例分析,读者可以自行假设一个异常球,根据其编码进行分析。
接下去我们分析一下使用该方法测量N个球的最少次数:
假设一共测n轮:
- n和三进制的长度一样
- 不能使用的编码(备注:在称球问题的一些变体中可以使用这些编码):
- 全1编码。如果一直不称量,无法知道其轻重
- 全0和全2编码。如果000和222代表同一个球,无法确定放在哪一边。
n位三进制的总数位,每个球需要两个编码。 所以我们一共可以测:
个球。
综上,我们可以确定对于jN个球称量的通用方法:
结果编码所对应的小球即为异常球,并可根据编码的正逆序获知轻重。
根据公式可以推论称量次数和小球数目的关系:
1.2次最多3个小球
2.3次最多12个小球
3.4次最多39个小球
4.5次最多120个小球
扩展问题:
针对一些称球问题的变体,仍然可以用三进制编码方法来解决。
- 假如不需要知道异常球的轻重,可测
个
- 增加一个球,编码为全1. 有且仅有一种情况无法知道轻重。
- 假如另外有一个已知正常球(不计算在可测球数内),可测
个
- 选一球编码为全0和全2, 始终放在左侧。额外正常球不编码,第一次放在右侧平衡。
- 结合1&2:
总结:
本文介绍了用三进制(Ternary)编码方法解决称球问题的方案。下一篇文章会提供一个称球问题公式的证明:n次称量,最多可以测 个球。