[面试题]1000瓶水中有1瓶是有毒的,问需要多少只老鼠才能试出那瓶有毒?

问题描述: 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,就是有毒的这瓶水的二进制数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值