香农信息熵之可怜的小猪

文章目录

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


题目

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

解析

香农熵公式

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

只测试一轮:

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

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

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

  1. 我们以 x1x2x3x_1 x_2 x_3x1x2x3 的形式表示 5 桶液体的 二进制 编号,如:第一桶液体二进制编号为 001
  2. 我们让第 i 只小猪喝二进制编号 xix_ixi1 的液体。即:
    • 第一只小猪需要喝的桶二进制编号为: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)kn,即 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)=xP(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)log2n<=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 ≤ 255buckets25 时,anwser = 2
  4. 那么可以得到公式关系:pow(base,ans)≥bucketspow(base, ans) ≥ bucketspow(base,ans)buckets,取对数后即为:ans≥log(buckets)log(base)ans ≥ \frac{log(buckets)}{log(base)}anslog(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));}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/443719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字符串匹配之KMP(KnuthMorrisPratt)算法(图解)

文章目录最长相等前后缀next数组概念代码实现图解GetNext中的回溯改进代码实现代码复杂度分析最长相等前后缀 给出一个字符串 ababa 前缀集合&#xff1a;{a, ab, aba, abab} 后缀集合&#xff1a;{a, ba, aba, baba} 相等前后缀 即上面用同样颜色标识出来的集合元素&#…

linux下tomcat6.0与jdk安装详细步骤

安装Tomcat6.0和JDK1.6 在linux系统上安装tomcat和jdk应该说是我学习linux知识的第一课了&#xff0c;之前只 是听说过&#xff0c;从没接触过&#xff0c;但我们公司项目都是部署在linux系统上的&#xff0c;那天上司突 然给我发了几个文档&#xff0c;让我看一下&#xff…

Android入门(一) | Android Studio的配置与使用

文章目录安装配置Android Studio使用Android Studio模拟器更改Android SDK的路径Hello World&#xff01;安装配置Android Studio 从这一步开始&#xff1a; 一直点 next 即可&#xff0c;直到存储路径的选择上&#xff0c;可以放到非 C 盘&#xff0c;这里我放到 D 盘了&am…

Android 入门(四) | Intent 实现 Activity 切换

文章目录Intent显式 Intent定义两个 xml 文件android:orientationmatch_parent 和 wrap_contentIntent函数定义两个 Activity隐式 Intent更多隐式 Intent 的用法用隐式 Intent 打开系统浏览器自建 Activity 以响应打开网页的 Intent向下一个活动传递数据返回数据给上一个活动In…

Android入门(二) | 项目目录及主要文件作用分析

文章目录项目目录分析app目录分析AndroidManifest.xml 分析MainActivity.kt 分析build.gradle 分析最外层目录下的 build.gradleapp 目录下的 build.gradle项目目录分析 我们来看一下 src/main/res 下的一些文件&#xff1a; .gradle 和 .idea &#xff1a;这两个目录下放置…

Android入门(三) | Android 的日志工具 Logcat

文章目录日志工具类 android.util.LogLogcat 中的过滤器日志工具类 android.util.Log Log 从属日志工具类 android.util.Log &#xff0c;该类提供了五个方法供我们打印日志&#xff1a; Log.v() &#xff1a;用于打印那些最为琐碎的、意义最小的日志信息。对应级别 verbose&…

Android 客户端与服务器交互方式

突然想到一个问题就是Android客户端与服务器交互有几种方式&#xff0c;因为在脑袋里想当然的就是webservices和json。要在Android手机客户端与pc服务器交互&#xff0c;需要满足下面几种条件&#xff1a;跨平台、传输数据格式标准、交互方便...。 为了与服务器通讯其实无非就…

Android入门(五) | Activity 的生命周期

文章目录Activity 的状态及生命周期实现管理生命周期FirstActivitySecondActivityDialogActivity运行结果旧活动被回收了还能返回吗&#xff1f;Activity 的状态及生命周期 Android 的应用程序运用 栈&#xff08;Back Stack&#xff09; 的思想来管理 Activity&#xff1a; …

Android入门(六) | Activity 的启动模式 及 生产环境中关于 Activity 的小技巧

文章目录Activity 的启动模式standardsingleTopsingleTasksingleInstance技巧了解当前界面是哪个 Activity随时随地退出程序启动活动的最佳写法Activity 的启动模式 standard&#xff1a;默认的启动方式&#xff0c;每次启动一个活动都会重新创建singleTop&#xff1a;如果该活…

Android入门(七) | 常用控件

文章目录TextView 控件&#xff1a;文本信息Button 控件&#xff1a;按钮EditText 控件&#xff1a;输入框ImageView 控件&#xff1a;图片ProgressBar 控件&#xff1a;进度条AlertDialog 控件&#xff1a;提示框ProgressDialog 控件&#xff1a;带有进度条的提示框TextView 控…

Android入门(八) | 常用的界面布局 及 自定义控件

文章目录LinearLayout &#xff1a;线性布局android:layout_gravity &#xff1a;控件的对齐方式android:layout_weight&#xff1a;权重RelativeLayout &#xff1a;相对布局相对于父布局进行定位相对于控件进行定位边缘对齐FrameLayout &#xff1a;帧布局Percent &#xff1…

Android入门(九)| 滚动控件 ListView 与 RecyclerView

文章目录ListView内置类型的简单运用定制数据类型提升效率点击事件RecyclerView布局管理器点击事件ListView 内置类型的简单运用 由于手机屏幕空间有限&#xff0c;能够一次性在屏幕上显示的内容不多&#xff0c;当我们的程序有大量数据需要显示的时候就可以借助 ListView 来…

关于“三门问题”的一些想法

三门问题&#xff08;Monty Hall problem&#xff09;亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论&#xff0c;大致出自美国的电视游戏节目Let’s Make a Deal。问题名字来自该节目的主持人蒙提霍尔&#xff08;Monty Hall&#xff09;。参赛者会看见三扇关闭了的门&#xf…

Android入门(10)| Fragment碎片详解

文章目录为什么要使用碎片&#xff08;Fragment&#xff09;实例布局文件FragmentActivity动态添加碎片布局文件FragmentActivity碎片通信Fragment布局文件Activity生命周期为什么要使用碎片&#xff08;Fragment&#xff09; 我们在手机上看新闻可能是这样的&#xff1a; Re…

Android开发(1) | Fragment 的应用——新闻应用

文章目录Item&#xff1a;标题子项布局文件Java代码标题碎片布局文件Java代码新闻内容碎片布局文件Java代码新闻内容活动布局文件Java代码首界面布局文件Java代码Item&#xff1a;标题子项 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Java Web整体异常处理

在实际的J2EE项目中&#xff0c;系统内部难免会出现一些异常&#xff0c;就如StrutsSpringHibernate项目&#xff1a;通常一个页面请求到达后台以后&#xff0c;首先是到action&#xff08;就是MVC中的controller&#xff09;&#xff0c;在action层会调用业务逻辑层service&am…

Android入门(11)| 全局广播与本地广播

文章目录广播概念接收广播动态注册实例静态注册实例发送广播发送标准广播广播的跨进程特性发送有序广播本地广播广播概念 Android 中的每个应用程序都可以对自己感兴趣的广播进行注册&#xff0c;这样该程序就只会接收到自己所关心的广播内容&#xff0c;这些广播可能是来自系…

Android开发(2) | 广播 Broadcast 的应用——强制下线功能

文章目录功能简介关闭所有活动登陆界面发送强制下线的广播广播接收器AndroidManifest.xml运行结果功能简介 强制下线功能只需要弹出一个对话框&#xff0c;让用户只能点击确定按钮&#xff0c;回到登录界面。 如果在每一个活动中添加一个对话框的话太过繁琐&#xff0c;用广播…

Android入门(12)| 数据持久化

文章目录数据持久化文件存储将数据存储进文件实例从文件中读取数据实例SharedPreferences存储将数据存储进文件实例从文件中读取数据实例实现记住密码的功能SQLite数据库存储创建自己的帮助类调用自己的帮助类补全 onUpgrade() 方法增删查改增&#xff1a;SQLiteDatabase.inser…

Android入门(13)| Android权限 与 内容提供器

文章目录普通权限与危险权限运行时申请权限内容提供器运用安卓封装好的内容提供器自实现的内容提供器概念实现普通权限与危险权限 主要用于不同应用程序之间在保证被访数据的安全性的基础上&#xff0c;实现数据共享的功能。 在 Android 6.0 开始引入了运行时权限的功能&…