老鼠毒药问题的思考

1000瓶酒中有2瓶毒药,由于总分配有499500种,且一只老鼠非生即死,只能提供1bit的信息,所以我们可以认为,最少需要的老鼠为19只(2^18=262144)。

我们可以发现,当总共只有两瓶酒时,你需要0只老鼠,当有三瓶酒时,你只需要2只老鼠,当只有4瓶酒时,你只需要3只,而当你有8瓶时,却只需要6只,9瓶也是6只,16瓶时只需要8只,25瓶是9只最佳,27瓶也只需要9只。

上面的做法是基于开方和开三次方的做法,我们知道,如何尽可能少的用两个正整数表达更大的数(不存在1时),那就是当其中一个数字较大的时候,使用乘方的方式。

然而,为什么在普通的老鼠毒药问题中,1000瓶只需要10只呢?那是因为我们使用了二进制的方法,对每一瓶酒进行了编码,将药水的每一位对应到一只老鼠上,由于2^10=1024>1000,所以我们能锁定它。但是一只老鼠最多表达0和1,这限制了它只能用二进制编码。所以我们需要使用矩阵,即开方的方式,尽可能降低所需要的老鼠的数量。

对于1000瓶酒,我们可以构建一个10x10x10的三维矩阵,将每一瓶酒都对应到一个坐标,最终只需要30只老鼠。但是,这离我们的下界19似乎还差着一段距离。

4的5次方是1024,我们只需要构建一个5维矩阵,每一维置边界为4,4x5=20,即可接近我们的19了。在电脑上,我们可以很轻松的实现,但在现实中,我们如何实现呢?

首先,我们构建一个3维的边界为4的正方体矩阵,并将其再复制成16个,摆成一个4x4的矩阵。再在最外面的矩阵上放置8只老鼠,我们在里面移动12只老鼠构成的3维坐标系,即可遍历所有药瓶。

但是事实上,这样是行不通的,最好情况下四个参数相同,直接定位出两瓶;最坏情况下两个坐标的5个参数各不相同,每个参数有两个选择,我们将会有2^5=32个坐标的组合。也就是说,我们最终还需要对这32瓶药进行一次检测,还需要5只老鼠。也就是说,我们是在拿第二次检测的时间来换空间。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值