卡特蘭數 [轉載]

me 一個童鞋跟 me 提過一個問題:說1-12 這 12 個數,分紅 2 組,而後每組按大小排序,其中一組中的數老是比另一組中對應順序的數要大,問有多少種狀況?me 還真作不出來,他告訴 me 說這是Catalan數。即便他這麼說,me 貌似仍是不太明白。不過這不影響,me 簡單搜索一下這個數(其實me之前就有所耳聞),有好幾個用處,簡單羅列一下。app

平衡括號

平衡括號:在一個合法的算術表達式中能夠出現的括號都是平衡括號,更專業一點的說法應該是「全部的左括號和右括號能夠創建一對一的對應關係,而且左括號在對應的右括號左側」。像()(), (())(), (()())(()) 都是平衡括號,可是(()))(, ()())() 就不是平衡括號。函數

觀察一下特色,判斷所給的一個括號串是否是平衡很容易:設置一個計數器,初始值爲 0,而後從左向右數,遇到左括號 +1,遇到右括號 -1,在過程當中不出現負數,而且最終的計數器仍是 0,那麼就是平衡括號;除此以外就是非平衡括號。排序

如今的問題是,若是有 n 對括號,問平衡的狀況有多少種?暫時能夠數一下 n = 1, 2, 3, 4 時的狀況:遞歸

n = 1: ()
n = 2: ()(),   (())
n = 3: ()()(),  ()(()), (())(), (()()), ((()))
n = 4:()()()(), ()()(()), ()(())(), ()(()()), ()((())), (())()(), (())(()), (()())(), ((()))(), (()()()), (()(())), ((())()), ((()())), (((())))

入棧出棧

問:n 個數入棧出棧,問狀況有多少種?get

好比所有入進去而後倒退出棧是 1 種;入一個出一個,所有都這樣,是 1 種。入棧出棧的狀況和n個數相不相同沒有關係。由於能夠視第一個入棧的爲 1,第二個爲 2,最後一個爲 n。若是是 n 個相同的數的入棧出棧狀況,假設數字都是括號,入棧是左括號,出棧是右括號,那麼一種入棧出棧狀況應該就對應平衡括號中的一種狀況,因此,該問題和問題1是等價問題。二叉樹

走方格

問:一個 n*n 的方格,從左下角走到右上角,只能向右和向上走,可是不能繞過左下角和右上角肯定的對角線,問有多少種走法?搜索

若是將向右走看作是入一下棧,向上走是出一下棧,不能繞道對角線以上,也就是一種合法的入棧出棧,從左下角開始到右上角,要入 n 次棧出 n 次棧,因此一種走法對應一種 n 個數的入棧出棧狀況,因而,此問題和問題2是等價問題;方法

二叉樹的形狀

問:n 個結點的二叉樹的形狀有多少種?co

所謂的二叉樹,就是有一個根結點,有棵左子樹還有一棵右子樹。n = 3: ()()(), ()(()), (())(), (()()), ((())) 時的括號匹配,me 們換個角度看這個表示:第一個成對的括號是樹根,括號內部的子串和括號右邊的子串依然是平衡括號串,把內部的看作是左子樹,把右邊的當作是右子樹,好比(())()對應的是有一個左節點和一個右節點的二叉樹,()()() 表示只有右子樹的二叉樹(右子樹只有一個右結點);若是上面的對應成立(遞歸證實),那麼二叉樹的狀況就和問題1 是等價問題;數字

矩陣鏈乘

問:A = A0 * A1 * A2 * ... * An,Ai 都是矩陣,式子合法,那麼問,若是使用括號來改變計算順序的話,計算方法有多少種?

原本的乘法運算是從左到右運算,me 們將運算使用棧模擬一下:首先將 A0 壓入棧底,而後看 A1,和棧頂的 A0 計算結果,棧頂 A0 出棧而結果入棧;看A2,和棧頂元素計算結果,棧頂元素出棧、結果入棧;...若是使用括號改變了順序,好比A0*(A1*A2)*...看A1的時候,入棧不計算結果,看A2的時候,計算結果,A1出棧結果入棧;...若是這樣看來的話,每一種計算順序,實際上對應一種 A0-A(n-1) 的入棧出棧狀況,因而,此問題和問題2等價;

...

有時候上面幾個問題的等價不是那麼明顯,然而上面的幾個問題均可以用同一個遞推公式來表示:

C0 = 1 ; 
Cn = ∑ Ci · C(n-1-i) ;

舉例:
C0 = 1; C1 = 1; C2 = 2; C3 = 5; C4 = 14;
C5 = C0C4 + C1C3 + C2C2 + C3C1 + C4C0 = 14+5+4+5+14 = 42

上面的幾個問題都是等價問題,所得的數就是 Catalan 數,能夠計算出通項公式(能夠使用生成函數法):

Cn = C(n,2n)/(n+1)
,其中C(m,n)是 n 個不一樣的數中取 m 個數造成的組合數;

注:C5 = 42,介貌似是一個灰常有名的數,能夠記一下。

相關文章
相關標籤/搜索