1. 程式人生 > >老鼠毒藥問題和它的擴展

老鼠毒藥問題和它的擴展

編號 這樣的 狀況 依據 log 說我 所有 結果 試驗

這是一個傳播得很廣的問題:有1000瓶液體。當中一瓶是毒藥。其它的都是清水。毒藥看上去和水一樣。僅僅能用老鼠來試驗。老鼠在喝了毒藥以後一個星期後一天內的隨意時刻死亡。

最少須要多少僅僅老鼠才幹找到毒藥?


n瓶液體其中一瓶有毒,總共同擁有n種可能性,用集合N來表示。

一僅僅老鼠的生死能夠用0、1表示。

r僅僅老鼠的生死構成了一個0、1串,這個0、1串能夠表示2的r次方中結果,用集合R表示。

我們就是要找一個實驗方法,通過這些老鼠的生死獲取毒藥的編號。

假設做個抽象,這個實驗方法是F。F把N中元素分別映射到R上。我們從R中的結果能夠猜測出這個N中元素。

所以R中的元素須要和N中的元素相等。

因此2的r次方等於n, r = log(n)。

回到這個問題上來,理論上。我們須要10僅僅老鼠才幹找出隱藏的毒藥。


詳細來說應該怎麽操作呢,也就是我們要尋找一種算法。

以及這樣的算法能否僅僅用10僅僅老鼠就找到1000其中的毒藥呢?

假設有一僅僅老鼠,我們能夠讓它喝一半的藥水。

它的生死就能確定毒藥在哪一半。

比如n = 8。

000 001 010 011 100 101 110 111

老鼠a 1 1 1 1

老鼠a喝下編號為5到8的全部藥水以後,假設毒藥在右半邊。老鼠死;否則,老鼠活。

假設用二進制去編碼藥水,一僅僅老鼠的生死能夠指示這一瓶毒藥某一位是0,還是1

最後的實驗方案是這種

000 001 010 011 100 101 110 111

a 1 1 1 1

b 1 1 1 1

c 1 1 1 1

不同的老鼠喝下自己一行中標註為1的藥水

假設是1000瓶藥水。依次用二進制表示。

按照上面的方式我們能夠用10僅僅老鼠來找到唯一的毒藥。


以下重點說下這個問題的拓展。

假設1000瓶液體其中有兩瓶毒藥,最少須要的老鼠是多少呢,應該怎樣操作?

依據前面的方法。我們先計算理論上的下界。

毒藥的分布總共同擁有C(1000,2)中情況,我們最少須要19僅僅老鼠。


首先把毒藥平均分成兩組。怎樣確定毒藥在哪一組呢?

比如:

A: 000 001 010 011

B: 100 101 110 111

一僅僅老鼠是不夠的

我們用兩僅僅老鼠a,b。

a喝下A組,b喝下B組。

假設兩僅僅老鼠所有死去,我們能夠確定毒藥分別在A、B其中。假設老鼠僅僅有一僅僅死去。我們能夠確定兩瓶毒藥在同一組裏

也就是說通過上訴方法,我們能夠確定毒藥編號的二進制表示的第1位的狀況(都是1,都是0。各自是0、1)


這種方法是否能確定第2位的狀態呢?

答案是能。

可是存在一個問題。

假設第1位各自是0、1,第2位也各自是0、1,那麽這兩個瓶的編號是00、11,還是01、10呢?


怎樣解決問題呢?

假設我們知道兩瓶毒藥的編號的第1位是不同的

比如:

A: 000 001 010 011

B: 100 101 110 111

毒藥1在A組,毒藥2在B組,那麽這個問題就變成了尋找一瓶毒藥的問題。針對n=8的情況,我們能夠再使用2對老鼠就能找到兩瓶毒藥的編號。

假設我們有兩周試驗的機會。能夠第一周先用2對老鼠(為什麽是2對?)找到毒藥編號哪一位是不同的。

在知道哪一位不同以後。在第二周用2對老鼠得到兩瓶毒藥的其它位值。

也就是說我們能夠用2*log2(n/2)+2*log(n/2) 僅僅老鼠在兩輪試驗的情況下找到兩瓶毒藥


可是我們僅僅同意有1輪試驗時間,怎樣解決呢?

既然不能猜,我們就全押好了。

對於n=8的情況,兩瓶毒藥的編號,可能在1、2、3位不同。總是有一位不同,也有可能好幾位不同。

我們先押第1位不同。也就是兩瓶毒藥分別在A、B組其中:

A: 000 001 010 011

B: 100 101 110 111

用2對老鼠分別測試A、B組毒藥。


再押第2位不同,兩瓶毒藥分別在C、D組中:

C: 000 001 100 101

D: 010 011 110 111

也是用兩對老鼠


再押第3位不同。分別在E、F組:

E: 000 010 100 110

F: 001 011 101 111


那麽這樣測試的結果會怎樣呢?

如果兩瓶毒藥編號在第3位同樣。

比方是010, 100,那麽E、F兩組測試的結果是F組的老鼠所有存活下來。

假設是011。 111。那麽E、F兩組的測試結果是E組的老鼠所有存活。

所以第3位不同樣的如果是不成立的。

也就是說哪一位假設是同樣的,針對那一位做的實驗會出現一組其中所有存活的情況。因此這兩組針對這一位的實驗是無效的。


假設兩瓶毒藥在第1位是不同的。

比如毒藥編號是011、100,那麽A、B組其中都會出現死亡,那麽第1位不同的如果是成立的,我們能夠得到各個位的值。


綜上所述在推測某一位不同一時候,我們須要2*log(n/2)僅僅老鼠;要押中全部位的話,我們須要log(n)*2*log(n/2)僅僅老鼠。

也就是說。假設n=1000。有兩瓶毒藥。

用上述方法。我們須要(10*2*9)180僅僅老鼠,才幹找出毒藥編號。

離我們的下界19有些遠。



老鼠毒藥問題和它的擴展