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只老鼠。也就是说,我们是在拿第二次检测的时间来换空间。