Catalan數

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

平衡括號

平衡括號:在一個合法的算術表達式中可以出現的括號都是平衡括號,更專業一點的說法應該是“所有的左括號和右括號可以建立一對一的對應關係,並且左括號在對應的右括號左側”。像()(), (())(), (()())(()) 都是平衡括號,但是(()))(, ()())() 就不是平衡括號。

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

現在的問題是,如果有 n 對括號,問平衡的情況有多少種?暫時可以數一下 n = 1, 2, 3, 4 時的情況:

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

入棧出棧

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

比如全部入進去然後倒退出棧是 1 種;入一個出一個,全部都這樣,是 1 種。入棧出棧的情況和n個數相不相同沒有關係。因爲可以視第一個入棧的爲 1,第二個爲 2,最後一個爲 n。如果是 n 個相同的數的入棧出棧情況,假設數字都是括號,入棧是左括號,出棧是右括號,那麼一種入棧出棧情況應該就對應平衡括號中的一種情況,所以,該問題和問題1是等價問題。

走方格

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

如果將向右走看做是入一下棧,向上走是出一下棧,不能繞道對角線以上,也就是一種合法的入棧出棧,從左下角開始到右上角,要入 n 次棧出 n 次棧,所以一種走法對應一種 n 個數的入棧出棧情況,於是,此問題和問題2是等價問題;

二叉樹的形狀

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

所謂的二叉樹,就是有一個根結點,有棵左子樹還有一棵右子樹。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,介貌似是一個灰常有名的數,可以記一下。

發佈了23 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章