作者: 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等。

性质:

1. 正序数的 3 进制补码为逆序数: 001  <=>   221
2. 正序数和逆序数在 ( ) 范围内对称,且数目一样多
3. 本文 我们用正序数代表小球更重,逆序数代表小球更轻。

对于每一轮的称量,我们都将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整除的时候。应该怎么做呢?

我们再引入三元组的概念:

三元组:

• 编码的每一位进行 0->1, 1->2, 2->0 转换 , 三个为一组 例如 : 012->120->201
• 同一个三元组的元素根据规则永远都会分配到不同的位置
• 我们利用三元组确保每次称球的平衡
• 例子 : 012->120->201

结合三元组的分配规则如下:

1. 当总数能够被 3 整除时,按照三元组分配
2. 如果不能够被 3 整除时,为了保持第一次称球时的平衡 :
1. 如果剩余一个球,分配 1 开头的编码。第一次不称。
2. 如果剩余两个球,分别分配 0 和 2 开头的编码。第一次分别放在左右。

后续出现称球不平衡时,用第一次称后已知的正常球补足。

下面以8个球为例:

编码方案:

具体过程:

###代表已知的正常球。第一轮至少可以获知两个正常球。通常我们只需要一个来保证天平两侧的平衡即可。这里仍然以6号球为例分析,读者可以自行假设一个异常球,根据其编码进行分析。

接下去我们分析一下使用该方法测量N个球的最少次数:

假设一共测n轮:

  1. n和三进制的长度一样
  2. 不能使用的编码(备注:在称球问题的一些变体中可以使用这些编码):
    1. 全1编码。如果一直不称量,无法知道其轻重
    2. 全0和全2编码。如果000和222代表同一个球,无法确定放在哪一边。

n位三进制的总数位,每个球需要两个编码。 所以我们一共可以测:  个球。

综上,我们可以确定对于jN个球称量的通用方法:

1. 通过公式 确定称球次数 n ,将 n 作为三进制的位数
2. 构造 n 位三进制的正逆序三元组编码
3. 给每一球分配一对编码(正序和逆序)
4. 当总数不能被 3 整除时,需要处理多余的球
1. 如果多 1 个,分配 1 开头的编码。后续左右数目不平时用已知正常球补足
2. 如果多 2 个,分配 0 和 2 开头的编码。后续左右数目不平时用已知正常球补足
5. 每一轮根据编码对应位的值放置小球,并记录结果

结果编码所对应的小球即为异常球,并可根据编码的正逆序获知轻重。

根据公式可以推论称量次数和小球数目的关系:

1.2次最多3个小球

2.3次最多12个小球

3.4次最多39个小球

4.5次最多120个小球

扩展问题:

针对一些称球问题的变体,仍然可以用三进制编码方法来解决。

  1. 假如不需要知道异常球的轻重,可测  

    1. 增加一个球,编码为全1.  有且仅有一种情况无法知道轻重。
  2. 假如另外有一个已知正常球(不计算在可测球数内),可测   个
    1. 选一球编码为全0和全2, 始终放在左侧。额外正常球不编码,第一次放在右侧平衡。
  3. 结合1&2: 

总结:

本文介绍了用三进制(Ternary)编码方法解决称球问题的方案。下一篇文章会提供一个称球问题公式的证明:n次称量,最多可以测 个球。

称球问题解析(3) - 公式证明_Phill.King的博客-CSDN博客

称球问题解析(2)-N球方法相关推荐

  1. 称球问题解析(1)- 12球

    作者: Phill King 邮箱: phillking1982@163.com 原创文章,转载请注明出处. 有12个外表一模一样的小球,除了有一个小球略轻或略重,其他的小球质量都是一样的.要求用没砝 ...

  2. 白盒测试——称重3次找到假球(基本路径测试)

    问题描述 使用白盒测试用例设计方法为下面的程序设计测试用例(基本路径测试)并Junit下测试: 程序要求 10个铅球中有一个假球(比其他铅球的重量要轻),用天平三次称出假球. 程序设计思路 第一次使用 ...

  3. 蓝桥杯第七届省赛java组大题解析(“取球博弈”??难度,“压缩变换”三星难度)

    第六题 题目: 方格填数 如下的10个格子    +--+--+--+    | 0| 1| 2| +--+--+--+--+ | 3| 4| 5| 6| +--+--+--+--+ | 7| 8| ...

  4. 十二个球称三次C语言编程,十二个球,有一个不知轻重,现有一个天平,称三次,找出此球!...

    平均分成A.B.C三组,每组4个: 第一秤:A.B两组先分别放天平左右: 情况一:平衡.则问题出在C组,A.B组共8个为标准球. 第二秤用3个标准球和C组的3个球对比, 如果第二秤平衡,剩下的一个就是 ...

  5. 12个乒乓球,其中有11个球每个球重量一模一样,另外1个球重量和那11个球不一样.用天平称三次,把单独的球(和那11个重量不一样的球)找出来

    12个乒乓球,其中有11个球每个球重量一模一样,另外1个球重量和那11个球不一样.用天平称三次,把单独的球(和那11个重量不一样的球)找出来 代码展示 import random a = random ...

  6. python 统计组合用什么库_Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法...

    本文实例讲述了Python数据分析之双色球统计两个红和蓝球哪组合比例高的方法.分享给大家供大家参考,具体如下: 统计两个红球和蓝球,哪个组合最多,显示前19组数据 #!/usr/bin/python ...

  7. (八)unity自带的着色器源码剖析之——————Unity3D的全局光照和阴影:下篇(unity3D中的球谐光照和SH球谐函数、unity实时阴影抗锯齿解决方案)

    一.探针基于球谐函数的全局光照 球谐光照是基于预计算辐射度传输理论实现的一种实时渲染技术.预计算辐射度传输技术能够重现在区域面光源照射下的全局照明效果.这种技术通过在运行前对场景中光线的相互作用进行预 ...

  8. 用C语言写一个球的程序,12个球的程序.....

    12个球的程序..... 微软的一道题目...上班很无聊 写来玩玩 有12个外表一模一样的小球,其中有一个的质量和其他11个球不一样(11个球的质量完全相同),而且该球不知道是轻点还是重点.现在给你一 ...

  9. 聚苯乙烯/二氧化硅荧光微球/硫化镉-聚苯乙烯微球CdS/PS复合微球的制备方式

    今天要分享的科研知识是聚苯乙烯/二氧化硅荧光微球/硫化镉-聚苯乙烯微球CdS/PS复合微球的制备方法,一起来学习! 聚苯乙烯/二氧化硅荧光微球的制备: 以聚苯乙烯和Na_2SiO_3·9H_2O为原料 ...

最新文章

  1. ssm查询一条数据并显示_高亮显示查询数据,其实很简单
  2. leetCode 53. maximum subarray
  3. Spring Boot 之spring.factories
  4. v$sql、v$sqlarea 、v$sqltext
  5. Mac安装sqlmap【亲测有用】
  6. 【转载】解决在Vim中鼠标右键不能粘贴
  7. 高德定位html,Ionic3 高德Web定位
  8. Deploy Apache Flink Natively on YARN/Kubernetes
  9. github 如何添加项目代码
  10. 使用MicroPython开发ESP32(06):WebServer功能实现简单说明
  11. 浅谈使用postman的CryptoJS.MD5加密带有中文(已进行unicode编码)以及url的字符串与md5在线加密工具加密不一致的原因,附加解决方法。
  12. emouse思·睿—评论与观点整理之三
  13. 【SpringBoot】SpringBoot的banner制作
  14. 【DDR3_Electrical Characteristics and AC Timing】_ Setup,Hold and Slew Rate Derating
  15. 从键盘任意输入一个年号,判断它是否是闰年。
  16. PHP套件的实验结果分析,PHP环境搭建套件评比测 | Wopus
  17. Makefile3、书写规则(文件搜寻、伪目标、多目标、静态模式、自动生成依赖性)
  18. 【Ant Design】图标大全(网断专用)
  19. memory interleaving(内存交织)
  20. MFC如何调用Flash控件

热门文章

  1. Python练习_数据类型_day5
  2. 【飞桨PaddlePaddle】四天搞懂生成对抗网络(二)——风格迁移的“精神始祖”Conditional GAN
  3. BitDock主题软件推荐
  4. 奶茶店制作微信小程序有用吗,成都奶茶店微信小程序开发
  5. 好朋友计算机教案,小班综合活动设计好朋友教案
  6. UX思考日志02 —— UX设计师的工作有哪些
  7. 优秀UX设计师的八条黄金法则
  8. Pytorch里.t()的作用
  9. 阴阳师服务器在维护,1月13日阴阳师服务器维护更新公告
  10. 我们不该是这样的结局