zoukankan      html  css  js  c++  java
  • 老鼠毒药问题和它的扩展

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



  • 相关阅读:
    笔记本电脑处理器(CPU)性能排行榜
    SQL Server 2008管理工具出现 远程过程调用失败0x800706be解决方法
    Installshield使用教程
    区间DP--凸多边形三角剖分
    树形DP--codevs 1380 没有上司的舞会
    DP练习 巡逻
    DP练习 最长上升子序列nlogn解法
    线段树 求区间连乘——hdu 3074 Multiply game
    模拟算法+栈 HDU 1022
    并查集--CSUOJ 1601 War
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7267069.html
Copyright © 2011-2022 走看看