1. 程式人生 > >[面試題]1000瓶毒藥裡面只有1瓶是有毒的,問需要多少隻老鼠才能試出那瓶有毒。

[面試題]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