老鼠毒藥問題和它的擴展
這是一個傳播得很廣的問題:有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 1c 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有些遠。
老鼠毒藥問題和它的擴展