老鼠毒药问题和它的扩展

Posted brucemengbm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了老鼠毒药问题和它的扩展相关的知识,希望对你有一定的参考价值。

这是一个传播得很广的问题:有1000瓶液体。当中一瓶是毒药。其它的都是清水。毒药看上去和水一样。仅仅能用老鼠来试验。老鼠在喝了毒药以后一个星期后一天内的随意时刻死亡。

最少须要多少仅仅老鼠才干找到毒药?


n瓶液体其中一瓶有毒,总共同拥有n种可能性,用集合N来表示。

一仅仅老鼠的生死能够用0、1表示。

r仅仅老鼠的生死构成了一个0、1串,这个0、1串能够表示2的r次方中结果,用集合R表示。

我们就是要找一个实验方法,通过这些老鼠的生死获取毒药的编号。

假设做个抽象,这个实验方法是F。F把N中元素分别映射到R上。我们从R中的结果能够猜測出这个N中元素。

所以R中的元素须要和N中的元素相等。

因此2的r次方等于n,  r = log(n)。

回到这个问题上来,理论上。我们须要10仅仅老鼠才干找出隐藏的毒药。


详细来说应该怎么操作呢,也就是我们要寻找一种算法。

以及这样的算法能否仅仅用10仅仅老鼠就找到1000其中的毒药呢?

假设有一仅仅老鼠,我们能够让它喝一半的药水。

它的生死就能确定毒药在哪一半。

比如n = 8。

              000 001 010 011 100 101 110 111

老鼠a                                 1     1     1     1

老鼠a喝下编号为5到8的全部药水以后,假设毒药在右半边。老鼠死;否则,老鼠活。

假设用二进制去编码药水,一仅仅老鼠的生死能够指示这一瓶毒药某一位是0,还是1

最后的实验方案是这种

              000 001 010 011 100 101 110 111

a                                  1     1     1     1

        b                    1      1                  1     1

        c              1            1           1            1

不同的老鼠喝下自己一行中标注为1的药水

假设是1000瓶药水。依次用二进制表示。

按照上面的方式我们能够用10仅仅老鼠来找到唯一的毒药。


以下重点说下这个问题的拓展。

假设1000瓶液体其中有两瓶毒药,最少须要的老鼠是多少呢,应该怎样操作?

依据前面的方法。我们先计算理论上的下界。

毒药的分布总共同拥有C(1000,2)中情况,我们最少须要19仅仅老鼠。


首先把毒药平均分成两组。怎样确定毒药在哪一组呢?

比如:

A:   000 001 010 011

B:   100 101 110 111

一仅仅老鼠是不够的

我们用两仅仅老鼠a,b。

a喝下A组,b喝下B组。

假设两仅仅老鼠所有死去,我们能够确定毒药分别在A、B其中。假设老鼠仅仅有一仅仅死去。我们能够确定两瓶毒药在同一组里

也就是说通过上诉方法,我们能够确定毒药编号的二进制表示的第1位的状况(都是1,都是0。各自是0、1)


这种方法是否能确定第2位的状态呢?

答案是能。

可是存在一个问题。

假设第1位各自是0、1,第2位也各自是0、1,那么这两个瓶的编号是00、11,还是01、10呢?


怎样解决问题呢?

假设我们知道两瓶毒药的编号的第1位是不同的

比如:

A:   000 001 010 011

B:   100 101 110 111

毒药1在A组,毒药2在B组,那么这个问题就变成了寻找一瓶毒药的问题。针对n=8的情况,我们能够再使用2对老鼠就能找到两瓶毒药的编号。

假设我们有两周试验的机会。能够第一周先用2对老鼠(为什么是2对?)找到毒药编号哪一位是不同的。

在知道哪一位不同以后。在第二周用2对老鼠得到两瓶毒药的其它位值。

也就是说我们能够用2*log2(n/2)+2*log(n/2) 仅仅老鼠在两轮试验的情况下找到两瓶毒药


可是我们仅仅同意有1轮试验时间,怎样解决呢?

既然不能猜,我们就全押好了。

对于n=8的情况,两瓶毒药的编号,可能在1、2、3位不同。总是有一位不同,也有可能好几位不同。

我们先押第1位不同。也就是两瓶毒药分别在A、B组其中:

A:   000 001 010 011

B:   100 101 110 111

用2对老鼠分别測试A、B组毒药。


再押第2位不同,两瓶毒药分别在C、D组中:

C: 000 001 100 101  

D: 010 011 110 111

也是用两对老鼠


再押第3位不同。分别在E、F组:

E: 000 010 100 110

F: 001 011 101 111


那么这样測试的结果会怎样呢?

如果两瓶毒药编号在第3位同样。

比方是010, 100,那么E、F两组測试的结果是F组的老鼠所有存活下来。

假设是011。 111。那么E、F两组的測试结果是E组的老鼠所有存活。

所以第3位不同样的如果是不成立的。

也就是说哪一位假设是同样的,针对那一位做的实验会出现一组其中所有存活的情况。因此这两组针对这一位的实验是无效的。


假设两瓶毒药在第1位是不同的。

比如毒药编号是011、100,那么A、B组其中都会出现死亡,那么第1位不同的如果是成立的,我们能够得到各个位的值。


综上所述在推測某一位不同一时候,我们须要2*log(n/2)仅仅老鼠;要押中全部位的话,我们须要log(n)*2*log(n/2)仅仅老鼠。

也就是说。假设n=1000。有两瓶毒药。

用上述方法。我们须要(10*2*9)180仅仅老鼠,才干找出毒药编号。

离我们的下界19有些远。



以上是关于老鼠毒药问题和它的扩展的主要内容,如果未能解决你的问题,请参考以下文章

用最少老鼠数找出7瓶药中的1瓶毒药

老鼠和毒药(面试题)

问题:有1000杯水,其中有一杯是毒水,现在需要从中找出含毒药的水,可以用老鼠来实验;老鼠如果喝了有毒的水,一个小时内必死,请问如何安排试验,能够用最少的实验材料在一个小时内检测出有毒的水?

不要总想着二进制

老鼠试毒 两轮试验

学会这个算法,告别地毯式搜索,开启你的大神成长之路