文章目录

  • 题目
  • 解析
    • 香农熵公式
    • 样例具体分析
  • 代码

题目

n 桶液体,其其中 正好 有一桶含有毒药,其装的都是水。它们从外观看起来都一样。为了弄清楚哪只水桶含有毒药,你可以喂一些猪喝,通过观察猪是否会死进行判断,实验对象的反应时间为 d 。不幸的是,你只有 t 时间来确定哪桶液体是有毒的。

解析

香农熵公式

根据题意,最大测试次数为 num = ∣td∣\vert\frac{t}{d}\vert∣dt​∣

只测试一轮:

考虑 num=1 时,也就是只进行一轮测试,容易想到可以使用与水同等数量的小猪来进行测试,n 个小猪喝 n 桶液体,哪个死翘翘哪一桶水有问题。

但这样的测试方式效率过低,我们其实可以结合二进制,让每个小猪同时测试多桶液体。这样祸害的小猪会少一点,更人道一些~

具体来说,我们需要 k 只小猪,k 满足 2k≥n{2^k} \geq n2k≥n。举个例子,当 n=5 时,可得 k = 3,即 3 只小猪即可一轮测出哪一桶是毒药,具体做法:

  1. 我们以 x1x2x3x_1 x_2 x_3x1​x2​x3​ 的形式表示 5 桶液体的 二进制 编号,如:第一桶液体二进制编号为 001
  2. 我们让第 i 只小猪喝二进制编号 xix_ixi​ 为 1 的液体。即:
    • 第一只小猪需要喝的桶二进制编号为:100、101
    • 第二只小猪需要喝的桶二进制编号为:010、011
    • 第三只小猪需要喝的桶二进制编号为:001、011、101
  3. 经过反应时间 d 后,观察所有小猪的状态,第 i 只小猪死亡则代表含毒的水桶其 编号第 i 位为 1 ,幸存则代表 编号第 i 位为 0 。从而得到含毒的水桶的编号。举例:第二、三只小猪死亡,说明第三桶液体含毒;第一、三只小猪死亡,说明第五桶液体含毒……

测试 num 轮:

  1. 只测试一轮时我们用二进制为水桶编号,因此测试 num 轮时,我们用 num+1 进制为水桶编号。
  2. 小猪数量 k 需满足 (num+1)k≥n{(num+1)^k} \geq n(num+1)k≥n,即 knum+1 进制的长度。
  3. 若某桶水的 num+1 进制中的第 x 位为 i(0<=i<=num),则代表将该水在第 i 轮喂给编号为 x 的小猪。

这样我们就得到了著名的 香农熵 公式:H(X)=−∑xP(x)log2[P(x)]H(X)=−\displaystyle \sum_{x}{P(x)log}_2 [P(x)]H(X)=−x∑​P(x)log2​[P(x)]

P(x) 代表随机事件 x 的发生概率。

本题中,记随机事件 An 桶液体中哪一个桶有毒,概率为 1n\frac{1}{n}n1​ 。

记随机事件 B 为在测试轮数为 num 时,所有实验对象的最终状态,每个实验对象的状态共有 num+1 种(一开始都是活的状态,每测一轮多一种状态的可能性——死 or 继续活),即 k 只小猪共有 C=(num+1)kC=(num+1)^kC=(num+1)k 种最终结果,可近似看做等概率 1C\frac{1}{C}C1​ 。

我们需要求得在满足 H(A)<=H(B)H(A)<=H(B)H(A)<=H(B) 前提下的最小 k 值。即:log2nlog2(num+1)<=k\frac{log_2{n}}{log_2(num+1)} <= klog2​(num+1)log2​n​<=k


样例具体分析

假设:总时间 minutesToTest = 60,死亡时间 minutesToDie = 15pow(x, y) 表示 xy 次方,ceil(x) 表示 x 向上取整。

那么:

  1. 当前有 1 只小猪的话,最多可以喝 num = minutesToTest / minutesToDie = 4 次水
  2. 最多可以喝 4 次水,能够携带 base = times + 1 = 5 个的信息量,也就是:
    • 喝 1 号死去,1 号桶水有毒
    • 喝 2 号死去,2 号桶水有毒
    • 喝 3 号死去,3 号桶水有毒
    • 喝 4 号死去,4 号桶水有毒
    • 喝了上述所有水依然活蹦乱跳,5 号桶水有毒
    • 反推得,当 buckets ≤ 5 时,小猪数量 answer = 1
  3. 那么 2 只小猪可以验证的范围最多到多少呢?我们把每只小猪携带的信息量(能测多少桶液体)看成是 base2 只小猪的信息量就是 pow(base,2)=pow(5,2)=25pow(base, 2) = pow(5, 2) = 25pow(base,2)=pow(5,2)=25,所以当 5≤buckets≤255 ≤ buckets ≤ 255≤buckets≤25 时,anwser = 2
  4. 那么可以得到公式关系:pow(base,ans)≥bucketspow(base, ans) ≥ bucketspow(base,ans)≥buckets,取对数后即为:ans≥log(buckets)log(base)ans ≥ \frac{log(buckets)}{log(base)}ans≥log(base)log(buckets)​,因为 ans 为整数,所以 ans=ceil(log(buckets)log(base))ans = ceil(\frac{log(buckets)}{log(base)})ans=ceil(log(base)log(buckets)​)

代码

class Solution {public:int poorPigs(int buckets, int minutesToDie, int minutesToTest) {int num = minutesToTest/minutesToDie;return (int)ceil(log(buckets) / log(num+1));}
};

香农信息熵之可怜的小猪相关推荐

  1. 贝叶斯、香农、奥卡姆合写博客「机器学习是什么」

    贝叶斯.香农.奥卡姆合写博客「机器学习是什么」 https://www.cnblogs.com/DicksonJYL/p/9698362.html 作者:Tirthajyoti Sarkar 来源:T ...

  2. 计算信源熵和香农编码C语言,信息论与编码课程设计报告-统计信源熵与香农编码.pdf...

    信息论与编码课程设计报告 设计题目: 统计信源熵与香农编码 专业班级 电 信 12-06 学 号 学生姓名 指导教师 教师评分 2015 年 3 月 30 日 目 录 - 0 - 一.设计任务与要求 ...

  3. [转]香农信息论与毒药称球问题

    原文链接 如果从'信息'的角度来分析某些问题,可以使你更登高望远,对问题能有更深层的理解,更容易融合各学科的间隙,达到借他山之石而攻玉的效果. 作者:张天蓉 老鼠检测毒药瓶 我出过一道有关用老鼠检测毒 ...

  4. 图像压缩编码——香农/哈夫曼编码

    图像压缩编码--香农/哈夫曼编码 一.信息熵 二.香农-范诺编码 2.1 香农-范诺编码简述 2.2 特例详解 三.哈夫曼编码 3.1 哈夫曼编码简述 3.2 特例详解 四.RGB图像压缩 Endin ...

  5. 学会重构与对比 ——码农鼻祖天才香农

    我不仅仅满足于向这台大脑里输入数据,还希望把文化的东西灌输进去. -- 克劳德·香农 1948年,一篇名为<通信的数学原理>的论文发表,这可能是20世纪最负盛名的论文之一,迄今被引用已突破 ...

  6. 【机器学习】当贝叶斯、奥卡姆和香农一起来定义机器学习时

    介绍 在机器学习的所有高级流行语中,我们很少听到一个短语将统计学习.信息论和自然哲学的一些核心概念融合成一个三个单词的组合. 并且,它不仅仅是一个用于机器学习(ML)博士和理论家的短语.对于任何有兴趣 ...

  7. 香农费诺编码 c语言实现,信息论课程设计(香农、费诺编码)

    <信息论课程设计(香农.费诺编码)>由会员分享,可在线阅读,更多相关<信息论课程设计(香农.费诺编码)(34页珍藏版)>请在人人文库网上搜索. 1.华北科技学院信息论基础课程设 ...

  8. 香农说,要有熵。信息时代由此开启……

    2016年四月三十日是克劳德·艾尔伍德·香农(Claude Elwood Shannon)的一百周年诞辰.虽然香农被学术届尊为信息时代之父,听说过这位科学巨人名字的想必比知道宋仲基的人少得多.不过不管 ...

  9. 实验三-香农编码的MATLAB实现

    信息论编码实验3~9连载,更多看专栏. 香农编码仿真实现 一.香农编码的原理 二.香农编码实例 三.程序及流程图 四.程序运行结果 五.程序自评价 一.香农编码的原理 香农码严格意义上来说不是最佳码, ...

最新文章

  1. ASP.NET 网站预编译概述
  2. C++ 默认参数和占位符
  3. 闪存我自己来——HDS公布闪存路线图
  4. odp 加固 mysql_creator是一款为php框架odp的脚手架工具
  5. App IM 之 环信
  6. 使用 pip 安装第三方库时出现:Read timed out
  7. 报童问题求解最大利润_OM | 选址问题模型研究——以悠桦林仓库布局实践为例...
  8. 硬件安全模块(HSM)
  9. QT使用QAxWidget读取Excel数据
  10. mysql实现停车场管理系统完整代码实现_JAVA实现简单停车场系统代码
  11. 为什么用线程池?解释下线程池参数?
  12. c语言打开xls文件格式,Excel2017如何打开et格式文件?Excel2017打开.et文件的方法介绍...
  13. 在word/wps插入代码+保持源代码风格+加行号
  14. 【练习】DIY青志协网站(html+css+js未分开)
  15. 数据库技术在项目中的应用?
  16. jQuery笔试题汇总整理--2018
  17. 展望:可见光通信技术标准体系建设
  18. CK3M自定义伺服算法(C语言)开发的简单流程
  19. 细分市场或成为OA产品同质化的救星|企服三会系列报道
  20. 《圣斗士星矢》的武士道精神

热门文章

  1. python数据可视化工具 pandas_Pandas数据可视化工具——Seaborn用法整理(下)
  2. activex控件 新对象 ocx 初始化_Office已经支持64位的树控件Treeview了
  3. php base64安全吗,php base64
  4. html5教学文档笔记,4.HTML 教程- (HTML5 基础)
  5. eclipse编译java项目class文件_动态编译 Java 代码以及生成 Jar 文件
  6. 电压源和电流的关联参考方向_结点电压法解题系列之四:电流源支路
  7. 【转】PF_RING开发指南
  8. 陀螺仪、罗经、IMU、MEMS四者的区别
  9. sharepoint服务器安装已安装netframework4.5,仍提示未安装
  10. c语言中指数优化,西藏东财中证医药卫生指数C净值下跌1.96% 请保持关注