這裡先從猜數字引入!
我們先來玩乙個猜數字遊戲:我心裡默念乙個1~64之間的數,你來猜(你只能問答案是「是」或「否」的問題)。為了保證不論在什麼情況下都能以盡量少的次數猜中,你應該採取什麼策略呢?很顯然,二分。先是猜是不是位於1~32之間,排除掉一半可能性,然後對區間繼續二分。這種策略能夠保證無論數字怎麼跟你捉迷藏,都能在log_2次以內猜中。用演算法的術語來說就是它的下界是最好的。
我們再來回顧一下這個遊戲所蘊含的本質:為什麼這種策略具有最優下界?答案也很簡單,這個策略是平衡的。反之如果策略不是平衡的,比如問是不是在1~10之間,那麼一旦發現不是在1~10之間的話就會剩下比n/2更多的可能性需要去考察了。
徐宥在討論中提到,這種策略的本質可以概括成「讓未知世界無機可乘」。它是沒有「弱點的」,答案的任何乙個分支都是等概率的。反之,一旦某個分支蘊含的可能性更多,當情況落到那個分支上的時候你就鬱悶了。比如猜數字遊戲最糟糕的策略就是乙個乙個的猜:是1嗎?是2嗎?… 因為這種猜法最差的情況下需要64次才能猜對,下界非常糟糕。二分搜尋為什麼好,就是因為它每次都將可能性排除一半並且無論如何都能排除一半(它是最糟情況下表現最好的)。
12個小球,其中有乙個是壞球。有一架天平。需要你用最少的稱次數來確定哪個小球是壞的並且它到底是輕還是重。
這個問題是一道流傳已久的智力題。網路上也有很多講解,還有泛化到n個球的情況下的嚴格證明。也有零星的一些地方提到從資訊理論的角度來看待最優解法。本來我一直認為這道題目除了試錯之外沒有其它高妙的思路了,只能乙個個方法試,並盡量從結果中尋找資訊,然後看看哪種方案最少。
然而,實際上它的確有其它的思路,乙個更本質的思路,而且根本用不著資訊理論這麼拗口的知識。
我們先回顧一下猜數字遊戲。為了保證任何情況下以最少次數猜中,我們的策略是每次都排除恰好一半的可能性。模擬到稱球問題上:壞球可能是12個球中的任意乙個,這就是12種可能性;而其中每種可能性下壞球可能輕也可能重。於是「壞球是哪個球,是輕是重」這個問題的答案就有12×2=24種可能性。現在我們用天平來稱球,就等同於對這24種可能性發問,由於天平的輸出結果有三種「平衡、左傾、右傾」,這就相當於我們的問題有三個答案,即可以將所有的可能性切成三份,根據猜數字遊戲的啟發,我們應當盡量讓這三個分支概率均等,即平均切分所有的可能性為三等份。如此一來的話一次稱量就可以將答案的可能性縮減為原來的1/3,三次就能縮減為1/27。而總共才有24種可能性,所以理論上是完全可以3次稱出來的。
如何稱的指導原則有了,構造乙個稱的策略就不是什麼太困難的事情了。首先不妨解釋一下為什麼最直觀的稱法不是最優的——6、6稱:在6、6稱的時候,天平平衡的可能性是0。剛才說了,最優策略應該使得天平三種狀態的概率均等,這樣才能三等分答案的所有可能性。
為了更清楚的看待這個問題,我們不妨假設有6個球,來考慮一下3、3稱和2、2稱的區別:
在未稱之前,一共有12種可能性:1輕、1重、2輕、2重、…、6輕、6重。現在將1、2、3號放在左邊,4、5、6放在右邊3、3稱了之後,不失一般性假設天平左傾,那麼小球的可能性就變成了原來的一半(6種):1重、2重、3重、4輕、5輕、6輕。即這種稱法能排除一半可能性。
現在再來看2、2稱法,即1、2放左邊,3、4放右邊,剩下的5、6不稱,放一邊。假設結果是天平平衡,那麼可能性剩下——4種:5重、5輕、6重、6輕。假設天平左傾,可能性也剩下4種:1重、2重、3輕、4輕。右傾和左傾的情況類似。總之,這種稱法,不管天平結果如何,情況都被我們縮小到了原來的三分之一!我們充分利用了「天平的結果狀態可能有三種」這個條件來三等分所有可能性,而不是二等分。
說到這裡,剩下的事情就實在很簡單了:第二步稱法,只要記著這樣乙個指導思想——你選擇的稱法必須使得當天平平衡的時候答案剩下的可能性和天平左傾(右傾)的時候答案剩下的可能性一樣多。實際上,這等同於你得選擇一種稱法,使得天平輸出三種結果的概率是均等的,因為天平輸出某個結果的概率就等同於所有支援這個結果(左傾、右傾、平衡)的答案可能性的和,並且答案的每個可能性都是等概率的。
mackay在他的書《information theory: inference and learning algorithms》(作者開放免費電子書)裡面4.1節專門講了這個稱球問題,還畫了一張不錯的圖,我就照抄了:
圖中「1+」是指「1號小球為重」這一可能性。一開始一共有24種可能性。4、4稱了之後不管哪種情況(分支),剩下來的可能性總是4種。這是乙個完美的三分。然後對每個分支構造第二次稱法,這裡你只要稍加演算就可以發現,分支1上的第二次稱法,即「1、2、6對3、4、5」這種稱法,天平輸出三種結果的可能性是均等的(嚴格來說是幾乎均等)。這就是為什麼這個稱法能夠在最壞的情況下也能表現最好的原因,沒有哪個分支是它的弱點,它必然能將情況縮小到原來的1/3。
這張圖邏輯已經很清晰了,但上圖中有一點的錯誤,也是唯一美中不足的一點!即正確的應該是1、2、5和3、4、6稱重對比,才有後續結論。
關於多執行緒的那點事之番外篇 Python
哈嘍各位小夥伴,很快啊,小澤馬上就又更新了,速度簡直不要太快!上回咱們不是說了怎麼開多執行緒嘛,那同樣的,還有乙個問題 公司已經下班了,但是員工還在努力工作。我們先來建立兩個員工 匯入執行緒模組 import threading 匯入休眠模組 from time import sleep 員工a d...
數學之美 關於概率
一直恨自己沒有學好數學 其實小學的時候我一直覺得自己數學特別好 那時總覺得自己某天必定可以解決那種世界性的難題 當然,那時候認為的世界性,就是很難很難的那種題 上了初中我就開始意識到自己貌似對數學已經失去了控制力了 到了高中這中失控感已經很明顯了 就像你突然置身於那種陌生的大城市,面對無數的車水馬龍...
組合數學之放球問題 附斯特林數
放球問題在組合數學中是乙個經典問題,在acm比賽中也經常會出現類似的題目,這裡做乙個歸納。我們假定現在有n個球,要放到m個盒子中,根據情況的不同主要可以分為一下8類 這裡確保n m 編號n個球是否有區別 m個盒子是否有區別 是否允許空盒1否 否是2否 否否3否 是否4否 是是5是 否否6是 否是7是...