1000瓶藥水,1瓶有毒藥,幾隻小白鼠能夠找出?

分享一道碼工面試的常見題:1000瓶藥水,1瓶有毒藥,服用後一小時毒發,毒藥可以無限稀釋,那麼一小時內用幾隻小白鼠能夠找出毒藥?

這道題考察的是對2進位的理解,具體實現與3老鼠確定8瓶子原理一樣。

000=0

001=1

010=2

011=3

100=4

101=5

110=6

111=7

每位數表示一隻老鼠,0-7表示8個瓶子。即將1,3,5,7號瓶子的葯混合取樣給鼠1吃,2,3,6,7號瓶子混合取樣給老鼠2吃……死鼠相應的位標為1。如鼠1死了,鼠2沒死,鼠3死了,那麼就是101=5號瓶子有毒。N只老鼠的量程為2^N,1000隻瓶子位於2^9 ~ 2^10,即10隻小鼠可以測1000瓶水。

這道題在一些稍難的面試中出現了各種變體,例如如果可以測兩輪,那麼可以測多少瓶水中的一瓶毒藥?

首先是第一輪死掉的小鼠不能被replace的情況,小鼠有三種狀態,第一輪死,第二輪死,和兩輪都沒死,那麼三種狀態可以類比為3進位,小鼠的量程為3^10即59049瓶,具體操作方式為對編碼為2的位數,第二輪混合喂。

然後是第一輪死掉的小鼠可以被replace的情況,將每1024瓶混合為1滴做第一輪,選定組別後第二輪確定瓶子編碼,量程為2^10 * 2^10即1048576瓶。

對不能replace的N輪,量程為(N+1)^10,能replace的N輪,量程為2^(10*N)。

第二種變體,如果1000瓶里有2瓶毒藥,需要多少只小鼠?

1000瓶里1瓶毒藥有1000種可能性,而1000瓶2瓶毒藥則有C(1000,2),即499500種可能性,那麼log2(499500) 為18.93,即需要19隻小鼠。具體實現方式為以兩兩混合法將1000瓶拆成499500滴,並用題目1中的方法測得。

那麼對1000瓶中的N瓶毒藥,則需要log2(C(1000,N))只小鼠,若N>=500,則取C(1000,1000-N)。

第三種變體,有16瓶水1瓶有毒,用多少只小白鼠能測出14瓶無毒的水?

將16瓶藥水用二進位XXXX表示,取3隻小白鼠來測,測出的狀態為XXX,那麼毒在XXX0或XXX1中,剩下14瓶無毒。


推薦閱讀:

二進位文件格式設計
如何區別二進位32個1表示-1,還是4294967295?
十分鐘 | 計算機硬體及組成原理(三)
二維碼是什麼原理

TAG:二进制 | 面试 | 计算机 |