香农信息熵之可怜的小猪
文章目錄
- 題目
- 解析
- 香農熵公式
- 樣例具體分析
- 代碼
題目
有 n 桶液體,其其中 正好 有一桶含有毒藥,其裝的都是水。它們從外觀看起來都一樣。為了弄清楚哪只水桶含有毒藥,你可以喂一些豬喝,通過觀察豬是否會死進行判斷,實驗對象的反應時間為 d 。不幸的是,你只有 t 時間來確定哪桶液體是有毒的。
解析
香農熵公式
根據題意,最大測試次數為 num = ∣td∣\vert\frac{t}ozvdkddzhkzd\vert∣dt?∣
只測試一輪:
考慮 num=1 時,也就是只進行一輪測試,容易想到可以使用與水同等數量的小豬來進行測試,n 個小豬喝 n 桶液體,哪個死翹翹哪一桶水有問題。
但這樣的測試方式效率過低,我們其實可以結合二進制,讓每個小豬同時測試多桶液體。這樣禍害的小豬會少一點,更人道一些~
具體來說,我們需要 k 只小豬,k 滿足 2k≥n{2^k} \geq n2k≥n。舉個例子,當 n=5 時,可得 k = 3,即 3 只小豬即可一輪測出哪一桶是毒藥,具體做法:
- 第一只小豬需要喝的桶二進制編號為:100、101
- 第二只小豬需要喝的桶二進制編號為:010、011
- 第三只小豬需要喝的桶二進制編號為:001、011、101
測試 num 輪:
這樣我們就得到了著名的 香農熵 公式: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)log2?n?<=k
樣例具體分析
假設:總時間 minutesToTest = 60,死亡時間 minutesToDie = 15,pow(x, y) 表示 x 的 y 次方,ceil(x) 表示 x 向上取整。
那么:
- 喝 1 號死去,1 號桶水有毒
- 喝 2 號死去,2 號桶水有毒
- 喝 3 號死去,3 號桶水有毒
- 喝 4 號死去,4 號桶水有毒
- 喝了上述所有水依然活蹦亂跳,5 號桶水有毒
- 反推得,當 buckets ≤ 5 時,小豬數量 answer = 1 。
代碼
class Solution { public:int poorPigs(int buckets, int minutesToDie, int minutesToTest) {int num = minutesToTest/minutesToDie;return (int)ceil(log(buckets) / log(num+1));} };總結
以上是生活随笔為你收集整理的香农信息熵之可怜的小猪的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++类和对象详解
- 下一篇: 使用github+jsdelivr作为视