老鼠毒藥問題和它的擴充套件

2021-09-07 13:33:37 字數 2823 閱讀 4260

這是乙個傳播得很廣的問題:有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有些遠。

老鼠毒藥問題

問題1 1000瓶水中有 1瓶下了毒,老鼠只要喝一點點就會在一周之內死掉,問至少需要多少只老鼠,才能在一周之內找出是哪一瓶水有毒?微軟筆試題 解析 假設有 n只老鼠,則瓶數的上限n 2 n 將瓶子的 10進製編號 0 n 1 改為n位的2進製碼,然後 從左到右 讓第1只老鼠喝所有 編號的2 進製碼中...

老鼠與毒藥問題

偶然在社群上看到這個問題,看到了程式設計師的回答,饒有興趣,於是查詢了csdn後,終於看懂了。有1000瓶液體 正常,無毒 但是由於工作人員失誤,將毒藥滴到了其中一瓶中,從外觀和氣味上完全無法分辨出哪乙個是被汙染過的,我們只知道這個毒藥的毒發期是7天,實驗室有10只小白鼠,只有7天的時間,如何實驗才...

老鼠與毒藥問題

大家應該都聽說過這個老題目 有 1000 個一模一樣的瓶子,其中有 999 瓶是普通的水,有一瓶是毒藥。任何喝下毒藥的生物都會在一星期之後死亡。現在,你只有 10 只小白鼠和一星期的時間,如何檢驗出哪個瓶子裡有毒藥?這個問題的答案也堪稱經典 把瓶子從 0 到 999 依次編號,然後全部轉換為 10 ...