面试-白鼠试毒

来源:互联网 发布:淘宝客分佣及代理系统 编辑:程序博客网 时间:2024/04/30 09:12
小白鼠试毒药问题描述如下:
    现有1000个小瓶和10只小白鼠,这1000个小瓶中有一瓶有毒药,其他都是水。只要小白鼠喝了毒药,过一段时间就会死掉。现在问如何利用这10只小白鼠一次性检查出哪瓶有毒药。
    问题的解法也很简单:
    按照海明码校验出错位的原理,依次把10只小白鼠放到1,2,4,8,16,32,64,128,256,512的位置,其他位置放置小瓶。每一个小瓶根据其位置分解成1,2,4,8,16,32,64,128,256,512的和,然后给相应位置上的小白鼠喝。过一段时间之后,根据小白鼠的生存情况,即可判断出哪瓶是毒药。
    例如,如果过了一段时间过后,小白鼠的情况是:0,0,1,0,1,0,1,1,1,0,(其中0代表存活,1代表死亡),那么有毒药的那个小瓶的位置是:0111010100,即468,即第468号放置的小瓶里面装的是毒药。
    这个问题很简单。

    现在的问题是,假如那1000个小瓶里面有2瓶里面有毒药,那么应该至少需要多少只小白鼠才能一次性检查出哪两瓶是毒药呢?这个问题与上面那个问题很相近,但是海明码校验出错位只能够纠正一个出错位,而无法确定出两个出错位,那么应该怎么办呢?
    对于这个问题,如果有如下假设:1.小白鼠喝的毒药的浓度越高,死的越快;2.最开始的小瓶里面,要么是纯水,要么是纯毒药;3.纯水与纯水混合,还是纯水;毒药和毒药混合,还是纯毒药;纯水与毒药混合,会降低其浓度;4.如果小白鼠喝了纯毒药和被稀释了的毒药,那么认为死亡时间和只喝纯毒药的死亡时间一样,即不会加快死亡。
    那么,基于以上假设,可以这样来解决这个问题:
    首先把这1000个小瓶里面的液体两两混合,则有1000*999/2=499500瓶新液体,这个时候,这些液体里面就只有1瓶毒药是纯毒药了,当然还有一些稀释了的毒药,但是不会影响结果。因为一段时间过后,最先死去的那些小白鼠都是喝了这瓶纯毒药的小白鼠。这样,就可以利用上面那个简单问题的解决方案来解决这个问题了。那么这种情况下,由于2^18<499500<2^19,则至少需要19只小白鼠,才能一次性检测出那瓶纯毒药,然后根据之前的混合关系,就知道了哪两瓶是纯毒药了。
    
    继续扩展思维。如果原来的1000瓶里面有3瓶毒药,那应该怎么办呢?有了上面的分析,思考起来就很简单了。将这1000瓶液体三三混合,则有1000*999*998/(3*2*1)瓶新液体,由于数量在2^27-2^28之间,则至少需要28只小白鼠才能一次性检测出哪三瓶是毒药,当然,还是基于上述那4个假设的基础上。

    当然,对于1000瓶里面有4瓶毒药,5瓶毒药,甚至跟多的毒药,则都可以在依据上述假设的基础上,利用上述方法进行检测。(当然,分的越多,实验员的工作就会越繁琐,仅混合液体就够麻烦了。呵呵:P)

    以上想法是我基于原始的小白鼠试毒药问题,通过扩散思维而想到的。只是在原有的海明码的基础上进行的扩充。但是我想,现阶段,应该有可以检测出2个甚至更多的错误位的校验码方法了吧?如果这种校验方法存在的话,那么同理可以引用进来进行检测。

    大家如果有什么更好的方法,还望不吝赐教。
0 0