香农信息熵之可怜的小猪
文章目录
- 题目
- 解析
- 香农熵公式
- 样例具体分析
- 代码
题目
有 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
只小猪即可一轮测出哪一桶是毒药,具体做法:
- 我们以 x1x2x3x_1 x_2 x_3x1x2x3 的形式表示
5
桶液体的 二进制 编号,如:第一桶液体二进制编号为001
。 - 我们让第
i
只小猪喝二进制编号 xix_ixi 为1
的液体。即:- 第一只小猪需要喝的桶二进制编号为:100、101
- 第二只小猪需要喝的桶二进制编号为:010、011
- 第三只小猪需要喝的桶二进制编号为:001、011、101
- 经过反应时间
d
后,观察所有小猪的状态,第i
只小猪死亡则代表含毒的水桶其 编号第i
位为1
,幸存则代表 编号第i
位为0
。从而得到含毒的水桶的编号。举例:第二、三只小猪死亡,说明第三桶液体含毒;第一、三只小猪死亡,说明第五桶液体含毒……
测试 num 轮:
- 只测试一轮时我们用二进制为水桶编号,因此测试
num
轮时,我们用num+1
进制为水桶编号。 - 小猪数量
k
需满足 (num+1)k≥n{(num+1)^k} \geq n(num+1)k≥n,即k
为num+1
进制的长度。 - 若某桶水的
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
的发生概率。
本题中,记随机事件 A
为 n
桶液体中哪一个桶有毒,概率为 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)log2n<=k
样例具体分析
假设:总时间 minutesToTest = 60
,死亡时间 minutesToDie = 15
,pow(x, y)
表示 x
的 y
次方,ceil(x)
表示 x
向上取整。
那么:
- 当前有
1
只小猪的话,最多可以喝num = minutesToTest / minutesToDie = 4
次水 - 最多可以喝
4
次水,能够携带base = times + 1 = 5
个的信息量,也就是:- 喝 1 号死去,1 号桶水有毒
- 喝 2 号死去,2 号桶水有毒
- 喝 3 号死去,3 号桶水有毒
- 喝 4 号死去,4 号桶水有毒
- 喝了上述所有水依然活蹦乱跳,5 号桶水有毒
- 反推得,当
buckets ≤ 5
时,小猪数量answer = 1
。
- 那么
2
只小猪可以验证的范围最多到多少呢?我们把每只小猪携带的信息量(能测多少桶液体)看成是base
,2
只小猪的信息量就是 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
。 - 那么可以得到公式关系: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));}
};
香农信息熵之可怜的小猪相关推荐
- 贝叶斯、香农、奥卡姆合写博客「机器学习是什么」
贝叶斯.香农.奥卡姆合写博客「机器学习是什么」 https://www.cnblogs.com/DicksonJYL/p/9698362.html 作者:Tirthajyoti Sarkar 来源:T ...
- 计算信源熵和香农编码C语言,信息论与编码课程设计报告-统计信源熵与香农编码.pdf...
信息论与编码课程设计报告 设计题目: 统计信源熵与香农编码 专业班级 电 信 12-06 学 号 学生姓名 指导教师 教师评分 2015 年 3 月 30 日 目 录 - 0 - 一.设计任务与要求 ...
- [转]香农信息论与毒药称球问题
原文链接 如果从'信息'的角度来分析某些问题,可以使你更登高望远,对问题能有更深层的理解,更容易融合各学科的间隙,达到借他山之石而攻玉的效果. 作者:张天蓉 老鼠检测毒药瓶 我出过一道有关用老鼠检测毒 ...
- 图像压缩编码——香农/哈夫曼编码
图像压缩编码--香农/哈夫曼编码 一.信息熵 二.香农-范诺编码 2.1 香农-范诺编码简述 2.2 特例详解 三.哈夫曼编码 3.1 哈夫曼编码简述 3.2 特例详解 四.RGB图像压缩 Endin ...
- 学会重构与对比 ——码农鼻祖天才香农
我不仅仅满足于向这台大脑里输入数据,还希望把文化的东西灌输进去. -- 克劳德·香农 1948年,一篇名为<通信的数学原理>的论文发表,这可能是20世纪最负盛名的论文之一,迄今被引用已突破 ...
- 【机器学习】当贝叶斯、奥卡姆和香农一起来定义机器学习时
介绍 在机器学习的所有高级流行语中,我们很少听到一个短语将统计学习.信息论和自然哲学的一些核心概念融合成一个三个单词的组合. 并且,它不仅仅是一个用于机器学习(ML)博士和理论家的短语.对于任何有兴趣 ...
- 香农费诺编码 c语言实现,信息论课程设计(香农、费诺编码)
<信息论课程设计(香农.费诺编码)>由会员分享,可在线阅读,更多相关<信息论课程设计(香农.费诺编码)(34页珍藏版)>请在人人文库网上搜索. 1.华北科技学院信息论基础课程设 ...
- 香农说,要有熵。信息时代由此开启……
2016年四月三十日是克劳德·艾尔伍德·香农(Claude Elwood Shannon)的一百周年诞辰.虽然香农被学术届尊为信息时代之父,听说过这位科学巨人名字的想必比知道宋仲基的人少得多.不过不管 ...
- 实验三-香农编码的MATLAB实现
信息论编码实验3~9连载,更多看专栏. 香农编码仿真实现 一.香农编码的原理 二.香农编码实例 三.程序及流程图 四.程序运行结果 五.程序自评价 一.香农编码的原理 香农码严格意义上来说不是最佳码, ...
最新文章
- ASP.NET 网站预编译概述
- C++ 默认参数和占位符
- 闪存我自己来——HDS公布闪存路线图
- odp 加固 mysql_creator是一款为php框架odp的脚手架工具
- App IM 之 环信
- 使用 pip 安装第三方库时出现:Read timed out
- 报童问题求解最大利润_OM | 选址问题模型研究——以悠桦林仓库布局实践为例...
- 硬件安全模块(HSM)
- QT使用QAxWidget读取Excel数据
- mysql实现停车场管理系统完整代码实现_JAVA实现简单停车场系统代码
- 为什么用线程池?解释下线程池参数?
- c语言打开xls文件格式,Excel2017如何打开et格式文件?Excel2017打开.et文件的方法介绍...
- 在word/wps插入代码+保持源代码风格+加行号
- 【练习】DIY青志协网站(html+css+js未分开)
- 数据库技术在项目中的应用?
- jQuery笔试题汇总整理--2018
- 展望:可见光通信技术标准体系建设
- CK3M自定义伺服算法(C语言)开发的简单流程
- 细分市场或成为OA产品同质化的救星|企服三会系列报道
- 《圣斗士星矢》的武士道精神
热门文章
- python数据可视化工具 pandas_Pandas数据可视化工具——Seaborn用法整理(下)
- activex控件 新对象 ocx 初始化_Office已经支持64位的树控件Treeview了
- php base64安全吗,php base64
- html5教学文档笔记,4.HTML 教程- (HTML5 基础)
- eclipse编译java项目class文件_动态编译 Java 代码以及生成 Jar 文件
- 电压源和电流的关联参考方向_结点电压法解题系列之四:电流源支路
- 【转】PF_RING开发指南
- 陀螺仪、罗经、IMU、MEMS四者的区别
- sharepoint服务器安装已安装netframework4.5,仍提示未安装
- c语言中指数优化,西藏东财中证医药卫生指数C净值下跌1.96% 请保持关注