这是一个传播得很广的问题:有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 1c 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有些远。