经典问题 小白鼠试毒药 这个算法你绝对不知道

问题

有1000瓶液体,其中1瓶是毒药,其余的都是水,小白鼠喝了之后一个小时才会生效,问怎样用较少的时间和较少的小白鼠找出这瓶毒药呢?

1000个小白鼠,1个小时?或者1只小白鼠,1000个小时?显然都不是

有一个直观的办法,假如有9个小白鼠,我们把1000瓶药分为10份,每只小白鼠吃一份,这样一次过后就可以把范围缩小到100瓶药,继续实验

但以上均不是最优的办法,其实只需要10只小白鼠,1个小时就可以了!

下面看讲解:

我们可以利用二进制很好地解决这个问题!
首先我们给1000瓶药按999,998,997,996…,3,2,1,0编好号,看了下图就差不多明白了
在这里插入图片描述
999对应的二进制位就是10位,为什么需要10只小白鼠正是这么来的,我们让这些小白鼠分别对应一位二进制位,假如对应的二进制位值为1,就让小白鼠喝下该瓶液体
比如:
第一只小白鼠喝下编号为999、998、997、996…的液体
第二只小白鼠喝下编号为999、998、997、996…的液体
第三只小白鼠喝下编号为999、998、997、996…的液体
第四只小白鼠喝下编号为999、998、997、996…的液体
第五只小白鼠喝下编号为999、998、997、996…的液体
第六只小白鼠喝下编号为…的液体
第七只小白鼠喝下编号为…的液体
第八只小白鼠喝下编号为999、998、997、996…3的液体
第九只小白鼠喝下编号为999、998…2的液体
第十只小白鼠喝下编号为999、997…3、1的液体

那么死掉的老鼠代表的二进制位就是1,没死掉的就代表0!
假如有毒的液体编号是3,那么第八只和第十只老鼠死了。
反过来,第八只和第十只老鼠死了,我们也可以推出有毒的液体编号是3。

再用一个结果举个例子,假如第八、九、十只老鼠死了,那么代表的二进制为0000000111,可以推出有毒的液体编号是7

是不是很神奇呢!等等!这个问题还没有解决呢!

进阶知识

请读者先理解好上面的讲解再继续看下去哈,防止懵逼!

那么问题来了,上面解读的是1次实验,10只小白鼠,那么假如进行两次实验,至少需要多少只小白鼠呢?答案是七只

两次实验,问题又来了!二进制不能用,那么用三进制!

同样地,我们给1000瓶药按999,998,997,996…,3,2,1,0编好号
在这里插入图片描述
第一次实验
我们的目的是确定进制位值为2的位,假如对应的二进制位值为2,就让小白鼠喝下该瓶液体

比如:
第一只小白鼠喝下编号为…的液体
第二只小白鼠喝下编号为…的液体
第三只小白鼠喝下编号为…的液体
第四只小白鼠喝下编号为…的液体
第五只小白鼠喝下编号为998、997、996…的液体
第六只小白鼠喝下编号为998、997、996…的液体
第七只小白鼠喝下编号为998、2…的液体

哪只小白鼠死掉了就代表对应位三进制的值为2

第二次实验
我们的目的是确定进制位值为1的位,假如对应的二进制位值为1,就让小白鼠喝下该瓶液体

同样的道理,哪只小白鼠死掉了就代表对应位三进制的值为1

进制位值为2、1的都测出来了,0的就没必要测了;

举个例子,6、7号小白鼠第一天死了,3、4号小白鼠第二天死了,那么毒药三进制表示为0011022,可以推出有毒的液体编号是116

当然了,三次实验的就要用四进制了,每次实验就验证一个四进制值就可以了,小白鼠的数量就是进制的最大位数啦!

知识总结

根据以上解读,知道小白鼠数量和实验次数的关系了吧!
小白鼠数量=液体的瓶数转换为实验次数+1进制的最大位数

计算公式就是:
小白鼠数量=[ l o g 实 验 次 数 + 1 液 体 数 量 log_{实验次数+1}{液体数量} log+1]
[]是向下取整的意思

小疑惑:
1、实验过程中小白鼠死掉会影响后面的实验吗?
不会的,小白鼠死掉了,那么其代表的进制位的值已经知道了

2、这是最优的解法吗?
以目前的知识证明,是的,感兴趣可以自行去了解香农熵

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旧林墨烟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值