鴿巢原理

鴿巢原理

雖然鴿巢原理看起來很容易理解,但有時使用鴿巢原理會得到一些有趣的結論:

比如:北京至少有兩個人頭髮數一樣多。

證明:常人的頭髮數目在15萬左右,可以假定沒有人有超過100萬根頭髮,但北京人口大於100萬。如果把每個鴿巢定義為「頭髮的數量」,便共有100萬個鴿巢。打一個比方,一根頭髮的人就會被編排在一根頭髮屬於的巢、兩根就在兩根頭髮屬於的巢,如此類推。鴿子則對應於人,那就變成了有大於100萬隻鴿子要進到100萬個巢中(另一種說法是把多於100萬個人編排到他們身上頭髮所屬的鴿巢,比如有一個人有三根頭髮,他便會進了屬於有三根頭髮的人的鴿巢)。因為北京人口多於100萬,如果受訪的前100萬人頭髮數目剛好不同,第100萬零一個的北京市民就必定會進了一個已經有一人在內的鴿巢。因此,我們便可以得到「北京至少有兩個人頭髮數一樣多」的結論。

另一個例子:

盒子裡有10隻黑襪子、12隻藍襪子,你需要拿一對同色的出來,最多需要拿出几只?假設總共只能拿一次,只要3隻就無法迴避會拿到兩隻相同颜色的袜子,因為顏色只有兩種(鴿巢只有兩個),而有三隻襪子(三隻鴿子),從而得到「拿3隻襪子出來,就能保證有一雙同色」的結論。

另一個例子:

某男性先後有過4位妻子,合共生有2子3女,則至少有2位子女有同一位母親,且至少1位妻子沒有女兒,至少2位妻子沒有兒子。

至少有2位子女有同一位母親 → 若非如此,即任何2位子女都沒有相同的母親,則該男性至少要有5位妻子,矛盾。

至少1位妻子沒有女兒 → 若非如此,即每位妻子都有女兒,則該男性至少要有4位女兒,矛盾。

至少2位妻子沒有兒子 → 若非如此,即最多1位妻子沒有兒子,則該男性至少要有3位兒子,矛盾。

更不直觀一點的例子:

有n個人(至少2人)互相握手(隨意找人握),必有兩人握過手的人數相同。

這裡,鴿巢對應於握過手人數,鴿子對應於人,每個人都可以與[0,n-1]人握過手(但0和n-1不能同時存在,因為如果一個人不和任何人握手,那就不會存在一個和所有其他人都握過手的人),所以鴿巢是n-1個。但有n個人(n隻鴿子),因此証明了命題正確。

鴿巢原理經常在計算機領域得到真正的應用。比如:哈希表的重複問題(衝突)是不可避免的,因為Keys的數目總是比Indices的數目多,不管是多麼高明的算法都不可能解決這個問題。這個原理,還證明任何無損壓縮算法,在把一些輸入變小的同時,作為代價一定有其他的輸入增大,否則對於長度為L的輸入集合,該壓縮算法總能將其映射到一個更小的長度小於L的輸出集合,而這與鴿巢理論相悖。

相关推荐

星星的猫和暴力鸟叔哪个好 全方位对比
36578130

星星的猫和暴力鸟叔哪个好 全方位对比

📅 07-15 👁️ 9088
“粉肠”“叉烧”!真的,我劝你别和广东人吵架!不然...
台湾诗选
365在线体育官方网站入口

台湾诗选

📅 07-20 👁️ 2999