面试-白鼠试毒
来源:互联网 发布:淘宝客分佣及代理系统 编辑:程序博客网 时间: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
- 面试-白鼠试毒
- 老鼠试毒算法
- 智力题-小白鼠试毒
- 毒
- 毒
- 毒...
- 毒......
- 毒
- 你好毒,你好毒
- 你好毒
- 毒-雪小禅
- 毒奶粉
- 够毒
- 毒啊
- 毒鸡汤
- 毒鸡汤
- 毒鸡汤
- 算你毒、算你毒、算你毒wuwuwuwu
- RHEL6: VNC 服务配置
- 微信公众平台开发资源集锦
- IOS面试题汇总(中英文)
- 导弹
- HDU-4907 Task schedule 预处理
- 面试-白鼠试毒
- 跌级系列—富有立体效果的吸声板材吊顶建材石膏板如何选购
- Java中的synchronized、Object.wait()、Object.notify()/notifyAll()原理
- 对于编程是那么的执着,不过,执着也需要更努力
- HDU 2222 Keywords Search AC自动机入门题
- SQL Server研究之统计信息—发现过期统计信息并处理详解
- java中字符串判断相等能用不等号吗
- Spring的IoC容器基本工作原理
- 火星A+B