问题描述: 1000瓶水里面只有1瓶是有毒的,毒发时间为1个小时,问需要多少只老鼠才能在1小时后试出那瓶有毒。
相关资料: Bloom Fliter 算法
参考思路:
210 = 1024 > 1000,也就是说1000以内的数都可以用10位的二进制来表示。
一 、 按照二进制的方式对1000瓶水进行编号:
第1瓶水:0000 0000 01
第2瓶水:0000 0000 10
第3瓶水:0000 0000 11
……
第998瓶水:1111 1001 10
第999瓶水:1111 1001 11
第1000瓶水:1111 1010 00
二、 取来十个碗来对应10个位置。根据每瓶水的二进制数,当某一位上是1的时候就往对应的碗里加1滴。
例如: 第三瓶水(0000 0000 11
),就往第九和第十个碗里各加一滴,第1000瓶水(1111 1010 00
)就往第一、二、三、四、五、七个碗里各加一滴。
三 、10只老鼠也按对应的碗喝水。
喝下水后,最后老鼠死了标记为1,活着就标记为0。最终用老鼠表示的二进制数转化为的十进制数就是有毒的那瓶水的编号。
举个例子:
假如有毒的水是第27瓶,二进制是0000 0110 11
,那么有毒的水只在第六、七、九、十个碗里,别的碗里都是无毒的。最后老鼠的存活状况表示出来的二进制数就是0000 0110 11
,就是有毒的这瓶水的二进制数