1. 程式人生 > >你是被編碼的羔羊嗎

你是被編碼的羔羊嗎

今天在孤獨大腦微信公眾號上看到一個有趣的演算法類題目。

題目是這樣的,一個國王有100桶酒,在一個漆黑的夜晚,有一個小偷,悄悄的往其中的一桶酒中投放了毒藥,毒藥是慢性藥,大約半個小時會發作,令人死亡。國王得知了這個資訊,決定找一些犯人,來嘗試喝酒,從而確定究竟哪桶就被投毒了。問題是,如何使用最少的犯人在最短的時間裡,確定被投毒的酒。

1,最容易想到的解決方案是,找99個煩人,每人喝每個桶中的一口,那麼半個小時之後,就可以分辨出哪桶酒被投毒了。

然而,用99個人太多了,肯定有優化的空間。

2,第二種方案是,將100桶酒拜訪成10 X 10的矩陣,找20個人,其中10個人,按行喝酒,把各行的10桶酒都喝一口。另外10個人,按列喝酒,把各列的10桶酒都喝一口,那麼,半小時之後,會有2個人死亡,這兩個人交叉的地方的那桶酒,被投毒了。

3,第三種方案是,擴充套件到三位空間,因為5 * 5 * 4 = 100,那麼找5+5+4=14個人,不同人分別喝一面的桶中的酒,那麼半小時後,會有3個人死亡,交叉的地方的那桶酒,是被投毒的。

那麼,還能再改進嗎?

採用二進位制編碼的方式可以繼續優化。

因為2的7次方為128,大於100了,所以,我們找7個人。對這100桶酒分別編號1~100,用二進位制表示各個編號。一桶酒的編號的二進位制數值,可以在7位以內進行表示,哪位為1,那麼該位置的人就要喝這桶酒。把100桶酒都這麼處理,那麼半小時候,會有若干個人死亡,那麼,死亡的人為1,未死亡的人為0,他們組成的數字對應的編號,即為被投毒的酒。這個方案,只需要7個人。

那麼既然編碼這麼好用,那為什麼我們不用三進位制,或者乾脆用十進位制呢?那樣使用的人數會更少。

這是因為,每桶酒只有有毒和沒毒2種狀態,所以得用二進位制。