[LeetCode][458. 可怜的小猪] 从 经典面试问题 到 信息论
By Long Luo
这道题让我想起了一个经典面试题:1000瓶药水,其中1瓶有毒,最少要几只老鼠? ,答案如下:
- 给 \(1000\) 瓶药水按 \(0 \dots 999\) 编号,把十进制转为二进制,每一只老鼠喝掉对应为 \(1\) 的药水;
- 再根据老鼠“死活”的状态确定药水的编号。
总共需要 \(10\) 只就够了, \(2^{10} = 1024 > 1000\) 。
然后受了这个思维定势,以为需要将 \(\textit{buckets}\) 瓶液体转成二进制,按照类似方法进行处理,然而却迟迟行不通,那么问题出在哪里呢?为什么这道面试题可以转成二进制进行处理?具体到这道题目却不行呢?
信息论
同样有一道面试题 N个乒乓球中有一个和其他的质量不同,用天平最少几次一定能称出来? ,这道题本质上是考察信息论。
假设 \(n\) 个球中有一个坏球,不知道轻重,并且记坏球出现在位置 \(i\) 的概率为 \(p_i\) ,其中 \(\sum_{i=1}^np_i=1\) 。那么从信息论的角度来看,其中蕴含的平均信息量为 \(H_{total} = -\sum_{i=1}^np_i \log_2(p_i)\) 。
当 \(H_{total}\) 取到极大值时,需要满足 \(p_1 = p_2 = \dots = p_{n-1} = p_n = \frac{1}{n}\) ,此时 \(H_{total} = \log_2n\) 。
每次天平称重会产生 \(3\) 种结果,分别记为 \(p_{equal}\) ,\(p_{left}\) ,\(p_{right}\) 每次称重可以获得的平均信息量为:
\[ H_{new} = - \left ( p_{equal} \log_2(p_{equal}) + p_{left} \log_2(p_{left}) + p_{right} \log_2(p_{right}) \right ) \]
,且满足 \(p_{equal} + p_{left} + p_{right} = 1\) 。
那么可以得到 \(H_{new} \le \log_2(3)\) ,当且仅当 \(p_{equal} = p_{left} = p_{right} = \frac{1}{3}\) 时取到等号。
所以题中要求选出 \(12\) 个球中的坏球,在最坏的情况下至少需要的次数 \(T_{min} = \lceil \frac {max_{H_{total}}}{max_{H_{new}}} \rceil = \lceil \log_3(12) \rceil = 3\) 。同理,最坏情况下要分辨出坏球并且推断出坏球是轻是重至少需要的次数为 \(T_{min}' = \lceil \log_3(25) \rceil = 3\) ,因为最坏情况坏球轻或重的概率相等且为 \(\dfrac {1}{2}\) 。但是怎样才能取到这个最小值呢?
每次都选平均信息增量最大的称法。