1. 程式人生 > >卡特蘭(Catalan)數入門詳解

卡特蘭(Catalan)數入門詳解

也許更好的閱讀體驗

基本概念

介紹

學卡特蘭數我覺得可能比組合數要難一點,因為組合數可以很明確的告訴你那個公式是在幹什麼,而卡特蘭數卻像是在用大量例子來解釋什麼時卡特蘭數
這裡,我對卡特蘭數做一點自己的理解
卡特蘭數是一個在組合數學裡經常出現的一個數列,它並沒有一個具體的意義,卻是一個十分常見的數學規律

對卡特蘭數的初步理解:有一些操作,這些操作有著一定的限制,如一種運算元不能超過另外一種運算元,或者兩種操作不能有交集等,這些操作的合法操作順序的數量

為了區分組合數,這裡用\(f_n\)表示卡特蘭數的第\(n\)項
從零開始,卡特蘭數的前幾項為\(1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790\ldots\)

定義

遞迴定義

\(f_n=f_0*f_{n-1}+f_1*f{n-2}+\ldots+f_{n-1}f_{0}\),其中\(n\geq 2\)

遞推關係

\(f_n=\frac{4n-2}{n+1}f_{n-1}\)

通項公式

\(f_n=\frac{1}{n+1}C_{2n}^{n}\)

經化簡後可得

\(f_n=C_{2n}^{n}-C_{2n}^{n-1}\)

只要我們在解決問題時得到了上面的一個關係,那麼你就已經解決了這個問題,因為他們都是卡特蘭數列


實際問題

先用一個最經典的問題來幫助理解卡特蘭數
去掉了所有的掩飾,將問題直接寫出來就是

例題1

在一個\(w\times h\)的網格上,你最開始在\(\left(0,0\right)\)上,你每個單位時間可以向上走一格,或者向右走一格,在任意一個時刻,你往右走的次數都不能少於往上走的次數,問走到\(\left(n,m\right),0\leq n\)有多少種不同的合法路徑。

合法路徑個數為\(C_{2n}^{n}-C_{2n}^{n-1}\)

直接求不好,考慮求有多少種不合法路徑
路徑總數為在\(2n\)次移動中選\(n\)次向上移動,即\(C_{2n}^{n}\)

畫一下圖,我們把\(y=x+1\)這條線畫出來,發現所有的合法路徑都是不能碰到這條線的,碰到即說明是一條不合法路徑
先隨便畫一條碰到這條線的不合法路徑,所有的不合法路徑都會與這條線有至少一個交點,我們把第一個交點設為\(\left(a,a\right)\)
如圖

我們把\(\left(a,a\right)\)之後的路徑全部按照\(y=x+1\)這條線對稱過去
這樣,最後的終點就會變成\(\left(n-1,n+1\right)\)

由於所有的不合法路徑一定會與\(y=x+1\)有這麼一個交點
我們可以得出,所有不合法路徑對稱後都唯一對應著一條到\(\left(n-1,n+1\right)\)的路徑
且所有到\(\left(n-1,n+1\right)\)的一條路徑都唯一對應著一條不合法路徑(只需將其對稱回去即可)
所以不合法路徑總數是\(C_{2n}^{n-1}\)

那麼合法的路徑總數為\(C_{2n}^{n}-C_{2n}^{n-1}\)

這是一個非常好用且重要的一個方法,其它的問題也可以用該方法解決
即找到不合法路徑唯一對應的到另一個點的路徑
如網格計數


方法

先將方法寫在前面吧
相信大家都聽過燒開水這個數學小故事吧
和學習數學一樣,轉化是基本思路,將一個問題轉化為另外一個已經解決了的問題是最重要的


01序列

你現在有\(n\)個\(0\)和\(n\)個\(1\),問有多少個長度為\(2n\)的序列,使得序列的任意一個字首中\(1\)的個數都大於等於\(0\)的個數
例如\(n=2\)時
有\(1100,1010\)兩種合法序列
而\(1001,0101,0110,0011\)都是不合法的序列

合法的序列個數為\(C_{2n}^{n}-C_{2n}^{n-1}\)

我們把出現一個\(1\)看做向右走一格,出現一個\(1\)看做向上走一格,那麼這個問題就和上面的例題\(1\)一模一樣了

拓展
如果是\(n\)個\(1,m\)個\(0\)呢?
不過是最後的終點變為了\(\left(n,m\right)\)罷了
如果是\(1\)的個數不能夠比\(m\)少\(k\)呢
我們只需將\(y=x+1\)這條線上下移動即可


括號匹配

你有\(n\)個左括號,\(n\)個右括號,問有多少個長度為\(2n\)的括號序列使得所有的括號都是合法的

合法的序列個數為\(C_{2n}^{n}-C_{2n}^{n-1}\)

要使所有的括號合法,實際上就是在每一個字首中左括號的數量都不少於右括號的數量
將左括號看做\(1\),右括號看做\(0\),這題又和上面那題一模一樣了


進出棧問題

有一個棧,我們有\(2n\)次操作,\(n\)次進棧,\(n\)次出棧,問有多少中合法的進出棧序列

合法的序列個數為\(C_{2n}^{n}-C_{2n}^{n-1}\)

要使序列合法,在任何一個字首中進棧次數都不能少於出棧次數\(\ldots\)
後面就不用我說了吧,和上面的問題又是一模一樣的了


312排列

一個長度為\(n\)的排列\(a\),只要滿足\(i<j<k\)且\(a_j<a_k<a_i\)就稱這個排列為\(312\)排列
求\(n\)的全排列中不是\(312\)排列的排列個數

答案也是卡特蘭數

我們考慮\(312\)排列有什麼樣的特徵
如果考慮一個排列能否被\(1,2,3,\ldots,n-1,n\)排列用進棧出棧來表示
那麼\(312\)排列就是所有不能被表示出來的排列
那麼這個問題就被轉化成進出棧問題了


不相交弦問題

在一個圓周上分佈著 \(2n\)個點,兩兩配對,並在這兩個點之間連一條弦,要求所得的\(2n\)條弦彼此不相交的配對方案數
當\(n=4\)時,一種合法的配對方案為如圖


合法的序列個數為\(C_{2n}^{n}-C_{2n}^{n-1}\)

這個問題沒有上面的問題那麼顯然,我們規定一個點為初始點,然後規定一個方向為正方向
如規定最上面那個點為初始點,逆時針方向為正方向
然後我們把一個匹配第一次遇到的點(稱為起點)旁邊寫一個左括號\((\),一個匹配第二次遇到的點(稱為終點)旁邊寫一個右括號\()\)
如圖


看出來嗎,在規定了這樣的一個順序後,在任意一個字首中起點的個數都不能少於終點的個數
於是這又是一個卡特蘭數列了


二叉樹的構成問題

有\(n\)個點,問用這\(n\)個點最終能構成多少二叉樹

答案仍然是卡特蘭數列

這個問題不是用上面的方法,是用遞迴定義的卡特蘭數

一個二叉樹分為根節點,左子樹,右子樹
其中左子樹和右子樹也是二叉樹,左右子樹節點個數加起來等於\(n-1\)
設\(i\)個點能構成\(f_i\)個二叉樹
我們列舉左子樹有幾個點可得
\(f_n=f_0*f_{n-1}+f_{1}*f_{n-2}+\ldots+f_{n-1}*f_{0}\)
這個和卡特蘭數列的遞迴定義是一模一樣的


凸多邊形的三角劃分

一個凸的\(n\)邊形,用直線連線他的兩個頂點使之分成多個三角形,每條直線不能相交,問一共有多少種劃分方案

答案還是卡特蘭數列

我們在凸多邊形中隨便挑兩個頂點連一條邊,這個凸多邊形就會被分成兩個小凸多邊形,由於每條直線不能相交,接下來我們就只要求這兩個小凸多邊形的劃分方案然後乘起來即可

和二叉樹的構成問題一樣,我們列舉大凸多邊形被分成的兩個小凸多邊形的大小即可


階梯的矩形劃分

一個階梯可以被若干個矩形拼出來
圖示是兩種劃分方式


像下圖是不合法的劃分方式

問,一個\(n\)階矩形有多少種矩形劃分

答案仍然是卡特蘭數列

我們考慮階梯的每個角

如圖

每個角一定是屬於不同的矩形的,我們考慮和左下角屬於一個矩形的是哪個角
這個矩形將這個梯形又分成兩個小梯形,如圖

於是我們又可以寫出遞推式了
和卡特蘭數列的遞迴式是一樣的

卡特蘭數就將這麼多吧

如有哪裡講得不是很明白或是有錯誤,歡迎指正
如您喜歡的話不妨點個贊收藏一下吧