一、问题描述

在12个外观完全相同的小球中,有一个与其它球重量不同。如何只用一架天平找到这个球并判断它比其它球轻还是重?最少需要称几次?39个球呢?

二、问题分析

这是一个很经典的信息论问题,最开始的思路是用分组称重的方法,发现每次测量的次数不固定,而且当球数增多时称重次数会明显增加,所以不是次数最优的方法,于是参考了网上编码的方法并做了一点调整。

一共有12个小球,每个小球都可能偏轻或偏重,共有24种可能,其信息量为 log224≈4.58bitlog2⁡24≈4.58bit。利用天平进行称重,天平每次显示结果可能为左倾、右倾或平衡三种,假如出现每种情况的概率相同,则每次称重结果的信息量为 log23≈1.58bitlog2⁡3≈1.58bit。4.58bit1.58bit≈34.58bit1.58bit≈3,所以理论上3次称重可以找出质量不同的球并判断出它是偏轻还是偏重。

根据文献The Problem of the Pennies, F. J. Dyson, The Mathematical Gazette , Vol. 30, No. 291 (Oct., 1946), pp. 231-234 的证明可知,N次称重最多可以从3N−323N−32个小球中找出不同的球,当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个球需要称重三次,则每个编码用三位字符表示。根据小球编码判断每次称重时该小球的位置。第 ii 次称重,选择编码第 ii 位为‘0’的小球置于左盘,第 ii 位为‘1’的小球置于右盘,记录天平结果并生成结果序列,为了保证每次称重左右两盘球数相同,编码序列每一位应均包含相同个个数的‘0’,‘1’,‘2’。我们用heavyheavy表示重球序列,lightlight表示轻球序列,序列生成规则如下:

天平结果

可能原因

处理方式

左倾

左盘含有重球

heavyi=0heavyi=0

右盘含有轻球

lighti=1lighti=1

右倾

右盘含有重球

heavyi=1heavyi=1

左盘含有轻球

lighti=0lighti=0

平衡

非标准球不在盘上

heavyi=2heavyi=2

lighti=2lighti=2

如第1次称重结果为天平右倾,则表明天平右盘含有一个重球,或左盘含有一个轻球,而此时天平右盘小球的第一位编码均为‘1’,左盘小球第一位均为‘0’,因此证明:异常球为重球且第一位为‘1’(heavy1=1heavy1=1),或者异常球为轻球且第一位为‘0’(light1=0light1=0)。根据该规则三次称重并记录完成后, heavyheavy 与 lightlight 均为一个三位的序列,且两个序列第 ii 位或‘0’,‘1’相反,或同时为‘2’,根据编码条件三可知,两个编码不可能同时存在,因此存在的编码所对应的小球即是异常球,且若该编码为 heavyheavy ,则异常小球偏重,否则偏轻。

3.3 一个例子

以下12个小球中有一个为异常球,下面对小球进行一组可行的编码并通过三次称重将其找出。首先对小球进行编码:

图1. 12个小球及其对应编码

进行第一次称重,将编码第一位为‘0’的小球(1,4,7,10)置于左盘,为‘1’的小球置于右盘(2,5,8,11),称重结果如下:

图2. 第一次称重结果

由于天平左倾,则表明左盘含有重球,或右盘含有轻球:heavy1=0heavy1=0,light1=1light1=1;

第二次称重,将编码第二位为‘0’的小球置于左盘,为‘1’的置于右盘,结果如下:

图3. 第二次称重结果

天平右倾,则表明右盘含有重球,或左盘含有轻球:heavy2=1heavy2=1,light2=0light2=0;

第三次称重,将编码第三位为‘0’的小球置于左盘,为‘1’的置于右盘,结果如下:

图4. 第三次称重结果

天平平衡,表示两边都为正常球,异常球第三位编码为‘2’:heavy3=2heavy3=2,2018-03-05 11:14

python小球方案问题_十二个小球称重问题及其Python实现相关推荐

  1. [Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  2. c语言中编程称量十二个小球的质量,c语言题:现有十二个小球,其中一个小球的重量与其... 有12个外观相同的小球,其中11个是标准球,质量完......

    导航:网站首页 > c语言题:现有十二个小球,其中一个小球的重量与其... 有12个外观相同的小球,其中11个是标准球,质量完... c语言题:现有十二个小球,其中一个小球的重量与其... 有1 ...

  3. 十二个小球称重问题及其Python实现

    一.问题描述   在12个外观完全相同的小球中,有一个与其它球重量不同.如何只用一架天平找到这个球并判断它比其它球轻还是重?最少需要称几次?39个球呢? 二.问题分析   这是一个很经典的信息论问题, ...

  4. python学习方法_十二种学习Python的方法

    python学习方法 Python是地球上最流行的编程语言之一. 它被世界各地的开发商和制造商所接受. 大多数Linux和MacOS计算机都预装了Python版本,现在,即使是少数Windows计算机 ...

  5. 「Python爬虫系列讲解」十二、基于图片爬取的 Selenium 爬虫

    本专栏是以杨秀璋老师爬虫著作<Python网络数据爬取及分析「从入门到精通」>为主线.个人学习理解为主要内容,以学习笔记形式编写的. 本专栏不光是自己的一个学习分享,也希望能给您普及一些关 ...

  6. 1000道Python题库系列分享十二(9道编程题)

    上期题目连接:1000道Python题库系列分享十一(9道) 上期题目答案: 本期题目: ---------董付国老师Python系列教材-------- 1)<Python程序设计(第2版)& ...

  7. python从入门到实践十二章

    python编程从入门到实践12章 今天看了星球里面一位学长的经历,感到很受鼓舞,他参加工作三年了,三月份到四月份自学完了三本书,感到和学长差距很大,我要努力去弥补! 决定首先开始三本书,廖雪峰的py ...

  8. Python序列练习题【第十二周】

    文章目录 Python编程函数题[第十二周] 一.寻找最长连续递增子序列 二.求和运算 三.寻找缺失的整数 四.求矩阵局部极大值 Python编程函数题[第十二周] 一.寻找最长连续递增子序列 a = ...

  9. python二级真题--共十二套--后六套--选择题

    上半部分 --> 请点击 https://blog.csdn.net/ExclusiveName/article/details/104537575 第七套真题 在面向对象方法中,一个对象请求另 ...

最新文章

  1. BigDecimal的使用说明
  2. vSphere HA 原理与配置
  3. 安装开源 ITIL 门户 iTOP
  4. 横向滚动条并且隐藏竖向滚动条
  5. 《编程之美》1.3一摞烙饼的排序
  6. C#:SQLite大量插入的效率问题
  7. opencv的lena项目,用android studio 3.6可以运行——drawable如何引入lena图片
  8. 发布谷歌离线地图瓦片
  9. 微信商户转账到银行卡-java_微信商户平台的钱如何转到个人账户中
  10. Typora 段落如何快速首行缩进两个字符
  11. windows 下在 码市(coding.net) 上配置远程 git
  12. Commitizen安装注意事项 git cz git: ‘cz‘ is not a git command
  13. ubuntu linux编译环境搭建,Ubuntu14.04开发环境搭建
  14. javaSE - 逻辑控制和输入输出(复习)
  15. 湖南省岳阳市谷歌高清卫星地图下载
  16. 文字校验的工具类--中文,电话号码,邮箱,身份证等信息的校验
  17. my97 datepicker 自定义事件
  18. 并发编程指南(二)Dispatch Queue
  19. C#鼠标键盘操作用于桌面脚本
  20. C语言小游戏-五子棋

热门文章

  1. 【每日一文】《数据分析:如何分析活动效果?》
  2. Qt 聊天软件 源码下载
  3. 起风了计算机音乐前奏,分手时不能听的4首歌,《起风了》上榜,第3首一听前奏就想哭!...
  4. ubuntu安装配置vim
  5. C++的get()函数使用详解
  6. 数字电子技术(五)触发器
  7. 使用浏览器开发工具测试网站可访问性的七种方法
  8. 西甲乐.fun|体育周末前瞻:西班牙人VS塞维利亚 至关重要的联赛第一胜
  9. 常火线、ACC(汽车知识)以及家用线常见接法
  10. table表格溢出隐藏