[面試題]1000瓶毒藥裡面只有1瓶是有毒的,問需要多少隻老鼠才能試出那瓶有毒。
題目:1000瓶毒藥裡面只有1瓶是有毒的,毒發時間為24個小時,問需要多少隻老鼠才能在24小時後試出那瓶有毒。
思路:這題試Bloom Fliter 演算法。詳情可以參考:https://blog.csdn.net/jiaomeng/article/details/1495500
這題和我之前看到的一道題有點像。題為,
有1000個蘋果,分別裝在10個箱子裡,任意給出1到1000之間的整數,都可以利用某幾個箱子中的蘋果數量獲得次數。
2^10 =1024 。也就是說10層二叉樹一定可以記錄1000種的狀態。每個節點放1。每一層的和就是一個數。
所以數分別為1 , 2 ,4 ,8,16, 32,64,128,256,489。(489=488+1,因為總數為1000)。
我們能表示出1024種狀態。
這個題是對bit位的應用,1000接近1024,所以需要10個bit位,對瓶子進行編號,從0到999,這樣需要10只老鼠。瓶子的編號分別為:
00000,00000
00000,00001
00000,00010,
00000,00011
00000,00101
00000,00111
。。。。。。
11111,00111
同時給老鼠編號,從1,2,...10,從低位開始,讓第n個老鼠喝下第n個bit位為1瓶子中的藥水。一週後,若所有的老鼠都沒有發病,那麼是第一個瓶子有毒,如果有一些老鼠發病,那麼從第到高的bit位置成1,其他的還是0。變成整數後,對應的數字即為有毒藥水的編號。
所以只要10只老鼠就能在 24小時後 排查出到底那瓶有毒。
看到有人用二分法解決:
第一次: 將1-500瓶兌在一起喝。
如果老鼠死了,則拿另一隻老鼠去品嚐501-725瓶兌的藥水。否則去喝2-250瓶兌的水。
採用如此二分法,因為2^10>1000 2^9<1000,所以10次就可以找出。
現在回到原題,老鼠會在24小時後死亡,這樣的化就不能跟去前一次的結果作出決策。但是可以覆蓋二分的所有支路,在24小時後,一次性作出判斷。
相當於將序列的二分法,改為並行的二分法。
具體如下:
第一隻: 喝 1-500
第二隻 1-250 500-725
第三隻 1-125 250-375 500-625 725-850
ling
、