1000瓶藥水,1瓶有毒藥,幾隻小白鼠能夠找出?
這道題考察的是對2進位的理解,具體實現與3老鼠確定8瓶子原理一樣。
000=0
001=1010=2
011=3100=4101=5110=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?
※十分鐘 | 計算機硬體及組成原理(三)
※二維碼是什麼原理