有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带毒的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出哪瓶水有毒?

这是一道很经典的面试题目,先说解题方法吧,2^n >= 1000,其中n就是小白鼠的数量。如果知道答案了,也许很多人就恍然大雾,当然有些专业的人士用下面的归纳法证明了下:

1)当n=1时,即有2瓶水,任取一瓶水喂老鼠,若24小时后老鼠死,则此瓶水有毒;若24小时后老鼠没死,则此瓶水无毒,另一瓶水有毒。课件只需一个老鼠即可判断出哪瓶有毒。即当n=1时命题成立。

2)假设当n=k(k>1)时,命题为真。即须k只老鼠即可判断出哪瓶水有毒。
   则当n=k+1时,即有2^(n+1)瓶水。
   将水分成2组,命名为P1和P2,每组2^n瓶水.
   则这两组瓶中有一组全没毒,另一组中有仅一瓶有毒。
   a) 取1只老鼠、任取一组瓶子,假设为P1,将P1中的全部瓶子水都让老鼠尝一下。则24小时后可以根据此老鼠的生死情况判断毒药在哪一组。
   b) 取k只老鼠,根据假设可知当n=k时,可判断哪瓶水有毒。用这k只老鼠同时去检测P1和P2,则24小时后可挑出P1中的某一瓶和P2中的某一瓶,这两瓶可能有毒。
   根据a、b中的结果综合分析,可得知毒药瓶是哪一个。
   即当n=k+1时,命题为真。

命题得证。

这个证明应该是没问题,但是我很感兴趣的就是,如何猜出来这个命题的哪?我就说下这个过程吧,来检测瓶中的水有没有毒,只能靠小白鼠死没死亡来判断,也就是2种状态,这里1表示死亡,0表示存活。那么10个小白鼠,那么可以表示2^10(代表10次方)中状态,也就是1024。那么这1024种状态能不能对应出那瓶水有毒那,如果可以这个题目就解决了。看到这里,又回到了上面的证明,这个归纳法明显可以证明,此猜想没问题。由此归纳法可以看出,此问题符合算法中的,动态规划法,也就是该问题可以分解成更小的问题,1000(也就是1024瓶以内)瓶水给10个老鼠喝,512(512瓶水以内)瓶水给9个老鼠喝...以此类推,平且每个大问题的子问题,还跟这个大问题有关系,由数学归纳法证明的第二步,可以看出,通过子问题的解决,更大的问题带入到步骤2中就可以解决了。

以上步骤说了半天都是,说明此方法是正确的,可证明的。但是如果要问怎么安排老鼠喝水,才能判断那瓶有毒那?也就是把这个动态规划的算法如何来实现。其实改归纳法证明中的第二步骤中的b)后面的内容,已经透露出了运用的实现方法。也就是把有所有的水给某一个老鼠P10喝,剩下的老鼠喝的水都不能包含P10喝的那瓶毒水,那么如果P10死亡了,剩下的都活着,就检查出来毒水了。以此类推老鼠P9喝的水肯定包含一瓶其他老鼠都没喝过的,这样才能检查出这瓶水有毒。这样我们就可以得出下面的结论:

1 表示死亡 0 表示存活

0000000001       P1喝了第一瓶的水,其他老鼠都没喝,那么P1老鼠死亡,其他没死推断出第1瓶水有毒

0000000010       P2喝了第二瓶的水,其他老鼠都没喝,那么P2老鼠死亡,其他没死推断出第2瓶水有毒

0000000100       P3喝了第4(2^2)瓶的水,其他老鼠都没喝,那么P3老鼠死亡,其他没死推断出第4(2^2)瓶水有毒

......

这里开始有疑问了,那么从第2---第4瓶水,中间的那瓶水有毒如何推断那?这里就用到一个方法叫组合。11代表第3瓶水有毒,也就是P1和P2必须同时喝第三瓶水,而P3不能喝,那么P1和P2死,P3没死就可以得出第三瓶水有毒。下面的各瓶水的判断,都快可以依据这个理论类推,根据上面数学归纳的证明,应该可以判断出来所有的剩余的水。这里可以发现一个显而易见的规律,P1老鼠所有奇数位置的水都得喝,因为P1老鼠可以测试有毒瓶子的位置为xxxxxxxxx1 (x代表未知),换成10进制必须包含一个2^0也就是1,那显然是奇数。只有这样才能组合出水的位置,从刚才第三瓶水的判断也可以看出。P2老鼠喝水当然也有规律了,xxxxxxxx1x,换成10进制必须包含2^1也就是2,根据2进制转换成10进制的算法,我们看下面的数字4=2^2 , 3=2^1 + 2 ^ 1 , 2 = 2^1 , 1=2^0其中3就包含了2^1方,也就是3号瓶子的水,P2必须喝,根据这个方法5=2^2 + 2^0那么5号p2就不用喝,我们总结下就可以看出,其实P2如果换成10进制的话,每隔2个位置就需要P2喝,也就是6,8,10,12...都需要。那么P3那同理根据这个推算方式,每隔4个位置就需要P3喝,也就是4,8,12...。至此所有的老鼠应该喝的水所在的瓶子的位置都判断出来了。

上面的方法,讲完后,如果你学习过计算机网络中海明码的编码规则,那你岂不是就恍然大悟了。这不就是海明码的编码规则么?下面我们就对比下海明码的编码规则:

下面看如何计算海明码(Hamming Code )

海明码(Hamming Code )编码的关键是使用多余的奇偶校验位来识别一位错误。

码字(Code Word) 按如下方法构建:

1、把所有2的幂次方的数据位标记为奇偶校验位(编号为1, 2, 4, 8, 16, 32, 64等的位置)

2、其他数据位用于待编码数据. (编号为3, 5, 6, 7, 9, 10, 11, 12, 13, 14, 15, 17等的位置)

3、每个奇偶校验位的值代表了代码字中部分数据位的奇偶性,其所在位置决定了要校验和跳过的比特位顺序。

位置1:校验1位,跳过1位,校验1位,跳过1位(1,3,5,7,9,11,13,15,…)   这里和老鼠和水的位置是不是一样的

位置2:校验2位,跳过2位,校验2位,跳过2位 (2,3,6,7,10,11,14,15,…)

位置4:校验4位,跳过4位,校验4位,跳过4位(4,5,6,7,12,13,14,15,20,21,22,23,…)

位置8:校验8位,跳过8位,校验8位,跳过8位(8-15,24-31,40-47,…)

如果全部校验的位置中有奇数个1,把该奇偶校验位置为1;如果全部校验的位置中有偶数个1,把该奇偶校验位置为0.

举例说明:

一个字节的数据:10011010

构造数据字(Data Word),对应的校验位留空_ _ 1 _ 0 0 1 _ 1 0 1 0

计算每个校验位的奇偶性 ( ?代表要设置的比特位):

位置1检查1,3,5,7,9,11:

? _ 1 _ 0 0 1 _ 1 0 1 0. 偶数个1,因此位置1设为0,即: 0 _ 1 _ 0 0 1 _ 1 0 1 0

位置2检查2,3,6,7,10,11:

0 ? 1 _ 0 0 1 _ 1 0 1 0. 奇数个1,因此位置2设为1,即: 0 1 1 _ 0 0 1 _ 1 0 1 0

位置4检查4,5,6,7,12:

0 1 1 ? 0 0 1 _ 1 0 1 0. 奇数个1,因此位置4设为1,即: 0 1 1 1 0 0 1 _ 1 0 1 0

位置8检查8,9,10,11,12:

0 1 1 1 0 0 1 ? 1 0 1 0. 偶数个1,因此位置8设为0,即: 0 1 1 1 0 0 1 0 1 0 1 0

因此码字为: 011100101010.

 查找并纠错一位错误

上例中构建了一个码字 011100101010,假定实际接收到的数据是011100101110. 则接收方可以计算出哪一位出错并对其进行更正。方法就是验证每一个校验位。记下所有出错的校验位,可以发现校验位2和8的数据不正确. 错误校验位 2 + 8 = 10, 则位置10的数据出错。一般说来,对所有校验位进行检查, 将所有出错的校验位置相加, 得到的就是错误信息所在的位置.

至此终于发现原来这个面试题目,使我们学过的。是不是感觉自己学的东西太糙了么?

小白鼠喝毒水的问题。相关推荐

  1. 小白鼠喝毒水问题(一分为二的思想)

    问题描述: 有16瓶药水,其中一瓶有毒,一只小白鼠喝过之后,一天之后会死亡,要求一天后,至少多少只小白鼠,可以找出有毒药水. 问题解决: 这个问题很经典,然而网上多是二进制转十进制思想. 我在这里尝试 ...

  2. 用小白鼠试验毒水问题

    问题一:8瓶水,其中一瓶有毒,问要找出有毒的水,你至少要尝试几次?(前提是毒不死人的) 问题二:还是这个题目,另外提供一群小白鼠,现在要你同时给N只小白鼠喝水,问至少需要几只小白鼠能一次性找出毒水? ...

  3. 笔试加分题:有16瓶水,其中只有一瓶水有毒,小白鼠喝一滴之后一小时会死。请问最少用() 只小白鼠,在1小时内一定可以找出有毒的水?

    原题: https://www.nowcoder.com/questionTerminal/a09c0eecbf684b0cba2ad0be32b7988e?orderByHotValue=1& ...

  4. 算法,16瓶水,有一瓶有毒,假设一只小白鼠喝一滴水,一个小时后会死亡,一个小时找出那瓶有毒的水至少需要几只小白鼠?

    首先16瓶水,编号0000,0001-1110,1111.然后让第一只小白鼠喝最低位为1的水,第二只小白鼠喝次最低位为1的水,第三只小白鼠喝第三位为1的水,第四只小白鼠喝最高位为1的水.一个小时后看小 ...

  5. LeetCode 458. Poor Pigs--智力题「小白鼠试毒」--C++,Python解法

    题目地址:Poor Pigs - LeetCode There are 1000 buckets, one and only one of them is poisonous, while the r ...

  6. 智力题------小白鼠试毒问题

    问题描述 有1000瓶水,其中有1瓶是有毒的.小白鼠喝了有毒的水之后24个小时就会死亡,问最少需要多少只小白鼠进行实验,才能在24小时内检测出哪瓶水有毒? 问题分析 如果没有时间限制的话,我们只要让一 ...

  7. (小白鼠喝药问题)1000瓶药水,其中有一瓶是有毒的,如何找出有毒的药水?

    问题描述 有 1000 瓶药水,但是其中有一瓶是有毒的,小白鼠只要喝了任意剂量的药水,24小时内就会死掉!请问,要在24小时内找出有毒的药水,最少需要多少只小白鼠? 解答 至少需要10只. 分析 1. ...

  8. 1000桶水,其中一桶有毒,猪喝毒水后会在15分钟内死去,想用一个小时找到这桶毒水,至少需要几头猪?具体该如何实现方法讲解

    对于此问题,一个思路是通过对问题分解: 首先一个猪在一个小时内的状态可以分为5种: 一.0分钟喝水,15分钟死去 二.15分钟活着再喝水,30分钟死去 三.30分钟活着再喝水,45分钟死去 四.45分 ...

  9. 1000瓶毒药,小白鼠测毒问题

    1000瓶药有1瓶有毒,如果小白鼠服用有毒的药,则24小时后死亡.现在需设计一种策略,使用尽可能少的小白鼠,在24小时内找出有毒的药. 如果用最普通的二分,第一只喝1-500,根据生存情况可以继续进行 ...

最新文章

  1. 1数字图像获取:1.2图像灰度直方图
  2. TypeScript 的 ?: 、两个问号、?. 分别是什么意思?
  3. Spring Transactional还能导致生产事故?
  4. 树莓派(Raspberry Pi)修改时区
  5. 教育部最新通知,中高考又有大变化,学生欲哭无泪,家长炸锅了
  6. XSD /xml 跟元素声明
  7. mysql 分号子查询_MySQL子查询详解
  8. visual studio 2013 快速安全ocx(ActiveX控件)开发
  9. 计算机应用基础题库及答案
  10. COGS 2075. [ZLXOI2015][异次元圣战III]ZLX的陨落
  11. 潮汕“木塞”(“木虱”)概率计算
  12. win10系统版本更新旧版本文件清理:如何安全删除win10中的Windows.old文件夹
  13. Visual Studio Code 代理设置
  14. 【Redux】异步action与同步action
  15. 你沐浴后的味道,根本让人把持不住!留香24小时,比喷了大牌香水还迷人!...
  16. kafka sasl java_Kafka安装及开启SASL_PLAINTEXT认证(用户名和密码认证)
  17. Grad-CAM:Visual Explanations from Deep Networks via Gradient-based Localization
  18. 瑞郎走弱有助于瑞士国家银行MogaFX外汇储备增加
  19. 第四次机考(2019) C. f1二
  20. Unity 群聚(生成鱼群)

热门文章

  1. eclipse怎么搜索关键字? eclipse查找关键字的技巧
  2. 微信小程序基础之开源项目库汇总
  3. [公告]博客园管理团队新增成员wayfarer
  4. java 调用打印机
  5. [渝粤教育] 江西财经大学 数据新闻可视化 参考 资料
  6. 【宝贝,既然你爱了,那就敞开心扉】
  7. 用JS实现的一个贷款计算器
  8. 2022-2028年中国房地产中介服务行业市场深度分析及投资前景分析报告
  9. 网易云音乐插件v2.8.2 安卓版
  10. 计算机 无法进入pe,无法进入老毛桃pe系统解决办法[推荐]