香農信息熵之可憐的小豬

文章目錄

  • 題目
  • 解析
    • 香農熵公式
    • 樣例具體分析
  • 代碼


題目

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_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)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)=?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 ≤ 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.pswp.cn/news/443719.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/443719.shtml
英文地址,請注明出處:http://en.pswp.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 開始引入了運行時權限的功能&…