小球称重的解法整合 N个小球有一个坏球,最少几次能找出坏球
    最近在看小球称重的问题,之前只记住了公式,最近回过来看,发现知乎上多了一些优质答案,遂记录一下。

现附上学习地址

先说结论,
N 个乒乓球中有一个和其他的质量不同,用天平最少几次一定能称出来?(并知道是轻了还是重了)
n次操作最多能解决以下个数的问题
3 n − 3 2 \frac{3^n-3}{2} 23n−3​
本文主要也阐述解决这个问题的方法。

N 个乒乓球中有一个和其他的质量不同,用天平最少几次一定能称出来?(不必知道轻了还是重了)
n次操作最多能解决以下个数的问题
3 n − 1 2 \frac{3^n-1}{2} 23n−1​

主要方法有如下几种

文章目录

  • 信息论
  • 三进制正逆序
  • 快速排序
  • 决策树
  • 矩阵
  • 递归
信息论

特点

  1. 简单暴力
  2. 容易理解
  3. 只能用于估计,答案在有些情况下是不对的
  4. 无法知道其具体操作过程,但是可以理论上估计操作次数

依托于香农的信息论,可以知道N个球的信息熵,以999个球的称重为例(不加以说明,下面都以999为例),每一个球都有可能成为异常球,如果是异常球,又有可能是轻或者重两种可能,所以一共有999*2的可能性,他的信息熵为 log ⁡ ( 999 ∗ 2 ) log ⁡ 2 = 10.97 \frac{\log(999*2)}{\log2}=10.97 log2log(999∗2)​=10.97
而每次称重最多有三个状态,每次可获得的最大信息熵为(注意此处)
log ⁡ 3 log ⁡ 2 = 1.58 \frac{\log3}{\log2}=1.58 log2log3​=1.58
所以应当有10.97/1.58次操作,计算后向上取整为7次。

值得注意的是,此处可获得的最大信息熵,我的理解是,每一次都做到可能性变为原来的1/3时才可行,考虑正好是3的指数个数时,每次都3等分称重,不论是相等还是有轻有重,都可以将可能性降为原来的1/3,这样这个公式才成立。但是实际上小球也存在不被等分的情况,这里默认可以被分为小数,但显然是不合规矩的。也就是,信息论可用于估计,但是也有可能会出错。以4为例,信息熵为3,3/1.58并向上取整,信息论表示答案为2 ,但事实上是分不出来的。

三进制正逆序

特点

  1. 稍显抽象
  2. 可以知道具体操作过程
  3. 答案准确

感谢知乎大佬,详见顶部原文,有论文和实现。

此处给出网页可视化实现及算法流程介绍

但是需要注意的是,不同浏览器显示不同,笔者用的是火狐浏览器,评论里有用谷歌浏览器的,都出现了12个球需要4次操作的情况,原文作者有介绍,是因为浏览器的精度计算问题。据其他评论者说,手机浏览器可以正常显示12个球三次操作,笔者自己实验的时候,使用了老版edge浏览器(不是新版,新版换了内核,也可能出现这个情况),可以正常展示12个球3次操作。

三进制正逆序算法原理是,

  1. 给每个球编号,编号原则为使用log(N*2+3)/log(3) 向上取整的数目的位数,构建3进制编号。
  2. 每个球都有正序号和逆序号,编号的每一位代表每次操作他所在的位置,0-小于,1-平衡,2-大于
  3. 第k次操作将所有的小球正序编号第k位三进制取出,0放在天平左边,2放在天平右边,1不放,如果左偏则记录为0,有偏记录为2,无偏记录为1.
  4. 将记录的编号与所有小球进行比较,如果和某个小球的正序一样,则这个小球比其它球重,如果和某个小球的逆序一样,则这个小球比其它球轻。

方法十分巧妙,当时也理解了很久,相当于这些小球的编号就是操作,如果每次操作都有他,最后一定是他。

快速排序

特点

  1. 依托快速排序

关于这个看了个大概,大概就是和快排思路类似,可知其交换次数为log(n)。具体还不太懂,以后有机会再更新。但是快排本质上也是在平衡每次操作之后的概率,和信息论有异曲同工之处。

决策树

可以利用离散数学中决策树的思想来解决问题,n将是决策树的根。在本题中,由于每次称重会有三种结果,分别是左边轻、右边轻、以及相等,因此题中的决策树将是一个三叉树。在n = 999的情况下称重的结果就是log3 999的上界,答案是7次。同样的道理也可以用在以两两对比为基础的排序算法的次数上,即对一个长度为n的数组进行排序的次数就是log2 n。

作者:谢坤
链接:https://www.zhihu.com/question/20854512/answer/95109354
来源:知乎

这个也不是特别懂,先记录。

矩阵

参考链接

递归

特点

  1. 数学性强
  2. 可以知道操作方式

原文已经写的很好了,此处转载他的图片。
首先是有一个引理。

在 3 k 3^k 3k个球中已知一个球偏重(偏轻同理),需要k次称量把它找出来。

下面证明需要反复使用引理。

作者:Ecthelion
链接:https://www.zhihu.com/question/20854512/answer/959690337
来源:知乎

先把球分成三堆。每一堆可以细分成n-1小堆。然后第一次称量。(WLOG:不失一般的)第二次。注意到情况1和(*)处的相似性!然后我们就可以用迭代算一下:中间三个分支实际上就是Lemma中k=n-2的情况,都需要n-2次称量。最右边的情况2,和”异常球在C中“是相似的,我们也可以用迭代算一下:得知情况二也需要n-2次称量。结论是:n次称量找出 个球中异常球并判断偏轻/偏重。

我觉得可以说是十分巧妙了,当时也想要用递归去写,但是却没有想到该怎么写。

小球称重的解法整合 N个小球有一个坏球,最少几次能找出坏球相关推荐

  1. 十二个小球,一个坏球,3次比较找出坏的那个

    参考链接: https://blog.csdn.net/qq_34192115/article/details/80425120 https://blog.csdn.net/iamthedoctor1 ...

  2. matlab最小字典序,12小球称重问题 完美解决方案(转自 skywind.name)

    网上 有好几种 解决方案,skywind.name上的这个最棒, 赞一下! 可惜 偶 苦思冥想 3 个小时,思路换了3.4种,也没找到完美解决方案. 以下 是 转自 skywind.name 12个小 ...

  3. 个人小项目:现有12个小球和一个天平,小球中有一个重量与其它的不同,称重几次能将这个小球找出来

    个人小项目:现有12个小球和一个天平,小球中有一个重量与其它的不同,称重几次能将这个小球找出来 写这个小项目的心思起源于一个知乎问题:假设现在有12个小球,其中一个重量与其他的不同,至少称多少次可以称 ...

  4. (称重问题)假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比

    问题描述 假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比.最少要称多少次才能找出这个较重的球? 解答思路 至少要称2次 将8个球分成3份,其中2份每份有3个球,设 ...

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

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

  6. 称金币问题: 有27枚金币,其中一个是假的。假的比真的略轻。现在有一个天平,问最少几次可以找出假币?

    称金币问题: 有27枚金币,其中一个是假的.假的比真的略轻.现在有一个天平,问最少几次可以找出假币? 1.此类题的最佳策略: 将总数尽可能等量的分三组进行测重:每称两组的时候,自然的能和剩下的一组进行 ...

  7. python小球方案问题_十二个小球称重问题及其Python实现

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

  8. 12球称重C语言算法,12小球称重问题

    题目: 已知有12个小球,一样的形状和外观,其中有一个是次品,现在给你一个无砝码的天平,称三次, 把这个次品找出来,并且求出这个次品相对真品是偏重还是偏轻? 解答: 首先把小球分成三堆,每堆四个. A ...

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

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

最新文章

  1. ICLR2020全析解读:华人学者占据60%,谷歌再次领跑!(附最新高引华人榜单)...
  2. 本地缓存需要高时效性怎么办_缓存在高并发场景下的常见问题
  3. 不可思议的#define
  4. CentOS 7.6 MySQL 8.0 RPM包方式安装及新特性介绍
  5. LiveVideoStackCon 2020北京站-售票通道关闭倒计时1天
  6. php遍历数组的四种方法,PHP遍历数组的常见几种方法
  7. Django2 Web 实战03-文件上传
  8. linux mysql学习_Linux学习笔记(MySql操作)
  9. leetcode344题:反转字符串
  10. 2022华为软件精英挑战赛
  11. python numpy安装步骤-NumPy基础与安装
  12. 禁用word公式编辑器
  13. 微信ubuntu版服务器,Ubuntu 18.04 安装微信(Linux通用)
  14. serialVersionUID详解
  15. 可视化数据分析图表设计必学技巧
  16. javalang 生成抽象语法树AST ----python源码分析
  17. 02-Sentinel-2 L1C级数据bat和Python脚本批量大气校正
  18. ios CAShapeLayer
  19. nginx系列(十七)nginx下的gzip与vary、预压缩、缓存、反向代理的结合
  20. 鲜为人知的windows命令

热门文章

  1. 按键精灵--多点找色浅谈
  2. 网络基础知识--IP地址
  3. 计算机专业开学周记,周记开学第一周
  4. Python实现一个论文下载器
  5. 当Navicat for Mysql出现 1045 -Access denied for user'root'@'ipAddress'(using password :yes)
  6. ESP8266 基础篇:内存分布
  7. 大数据培训课程Yarn资源调度器任务的推测执行
  8. 【Hi3519A】测试华为M2221-QL智能摄像头
  9. android 启动画面广告,Android 应用启动欢迎界面广告的实现实例
  10. App抓包数据包之Paros的安装及使用