什麼是Catalan數
說到Catalan數,就不得不提及Catalan序列,Catalan序列是一個整數序列,其通項公式是我們從中取出的就叫做第n個Catalan數,前幾個Catalan數是:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, …咋看之下沒什麼特別的,但是Catalan數卻是許多計數問題的最終形式。
Catalan數的一些性質
Catalan數的基本公式就是上個部分所列出的那樣,但是卻有一些變形和具體的性質:
1、
這是根據原來的式子推匯出來的,大概過程是這樣的:
2、
這個遞推式很容易可以從原來的式子中獲得
3、
4、
5、
這個是Catalan數的增長趨勢。
Catalan數在組合計算中的應用
在《組合數學》(機械工業出版社)一書中,介紹Catalan數是由其一個應用推匯出的公式,其具體的描述如下:
n個+1和n個-1構成2n項,其部分和滿足的序列個數等於第n個Catalan數。
其證明也不難,我們假設不滿足條件的序列個數為,那麼就有。剩下的工作就是求了,我們假設有一個最小的k令。由於這裡k是最小的,所以必有,並且k是一個奇數。此時我們將前k項中的+1變為-1,將-1變為+1,那麼就得到一個有(n+1)個+1和(n-1)個-1的序列了,這樣的序列個數就是我們要求的,數值大小為 。那麼我們就得到了,就是我們前面的公式。
在具體的組合數問題中,很多都可以轉換為Catalan數進行最後的計算,如下:
1、如上文所說,對於任意的k,前k個元素中-1的個數小等於+1的個數的序列計數,我們可以不停地變換形式,比如將-1看成右括弧,+1看成左括弧,就變成了合法括號運算式的個數。比如2個左括弧和2個右括弧組成的合法運算式有種,是()()和(())。
2、既然如上一點都把括弧加上去了,那麼順便就再次轉換,n+1個數連乘,乘法順序有種,比如我們三個數連乘a*b*c,那麼等於在式子上加括弧,有2種乘法順序,分別是(ab)c和a(bc)。貌似對應關係比較模糊,我們取n為3來看看,n為3的時候就是4個數相乘了,那麼我們設為abcd,最初的標號定在a上,我們對於n為3得到合法的括弧序列有5個,分別是:((())),()(()),()()(),(())()和(()()),那麼我們將一個左括弧看成是當前運算元指標往右移動一個位置,一個右括弧看成是當前運算元和左邊最近的一塊運算元相乘起來,那麼對應的五個運算式就是:a(b(cd)),(ab)(cd),((ab)c)d,(a(bc))d和a((bc)d),他們之間是一一對應關係。
3、n個節點的二叉樹的所有可能形態數為,這一點很容易證明,我們考慮隨便取一個節點作為根,那麼他左邊和右邊的兒子節點個數就確定了,假定根節點標號為x,那麼左子樹的標號就從1到x-1,共x-1個,右子樹的標號就從x+1到n,共n-x個,那麼我們的x從1取到n,就獲得了所有的情況數。這個式子就是我們性質3的式子。
4、n個非分葉節點的滿二叉樹的形態數(對稱後得到的二叉樹除非自己本身對稱,否則算是不同),這裡取Wikipedia上的一張圖片說明問題:
這裡要求滿二叉樹,實際上就是在上一點的每個子節點的空兒子上都加上葉子,就形成了我們的圖了,那麼我們要求的結果就是Catalan數。
5、對於一個n*n的正方形網格,每次我們能向右或者向上移動一格,那麼從左下角到右上方的所有在副對角線右下方的路徑總數為。同樣引用Wikipedia上的一張圖片來表示:
我們將一條水平邊記為+1,垂直邊記為-1,那麼就組成了一個n個+1和n個-1的序列,我們所要保證的就是前k步中水平邊的個數不小於垂直邊的個數,換句話說前k個元素的和非負,就是我們關於Catalan數的定義。
6、凸n+2邊形進行三角形分割(只串連頂點對形成n個三角形)數:
7、n個數入棧後的出棧的排列總數是。例如1,2,3入棧的出棧排序有123,132,213,231和321五種
8、對於集合的不交叉劃分的數目為,這裡解釋一下不交叉劃分,我們對於集合{a,b}和{c,d},假設他們組成了兩個區間[a,b]和[c,d],我們假設兩個區間不重合,那麼以下四種情況當做是不交叉的:a<c<d<b,a<b<c<d,c<a<b<d與c<d<a<b,就是說兩個區間可以包含或者相離,那麼此時我們稱集合{a,b}和{c,d}是不交叉的。對於集合,將裡面元素兩兩分為一子集,共n個,若任意兩個子集都是不交叉的,那麼我們稱此時的這個劃分為一個不交叉劃分。此時不交叉的劃分數就是我們的了,證明也很容易,我們將每個子集中較小的數用左括弧代替,較大的用右括弧代替,那麼帶入原來的1至2n的序列中就形成了合法括弧問題,就是我們第二點的結論。例如我們的集合{1,2,3,4,5,6}的不交叉劃分有五個:{{1,2},{3,4},{5,6}},{{1,2},{3,6},{4,5}},{{1,4},{2,3},{5,6}},{{1,6},{2,3},{4,5}}和{{1,6},{2,5},{3,4}}。
9、n層的階梯切割為n個矩形的切法數也是。如所示:
這個證明是怎麼進行的呢?我們先繪製如下的一張圖片,即n為5的時候的階梯:
我們注意到每個切割出來的矩形都必需包括一塊標示為*的小正方形,那麼我們此時枚舉每個*與#標示的兩角作為矩形,剩下的兩個小階梯就是我們的兩個更小的子問題了,於是我們的注意到這裡的式子就是我們前面的性質3,因此這就是我們所求的結果了。
10、在一個2*n的格子中填入1到2n這些數值使得每個格子內的數值都比其右邊和上邊的所有數值都小的情況數也是。
11、平面上串連可以形成凸包的2n個點分成2個一組連成n條線段,兩兩線段之間不相交的情況總數是,這裡實際上和第7點本質上是一樣的,這裡就不解釋了。
Catalan數問題的一個變形:
n+m個人排隊買票,並且滿足,票價為50元,其中n個人各手持一張50元鈔票,m個人各手持一張100元鈔票,除此之外大家身上沒有任何其他的錢幣,並且初始時候售票視窗沒有錢,問有多少種排隊的情況數能夠讓大家都買到票。
這個題目是Catalan數的變形,不考慮人與人的差異,如果m=n的話那麼就是我們初始的Catalan數問題,也就是將手持50元的人看成是+1,手持100元的人看成是-1,任前k個數值的和都非負的序列數。
這個題目區別就在於n>m的情況,此時我們仍然可以用原先的證明方法考慮,假設我們要的情況數是,無法讓每個人都買到的情況數是,那麼就有,此時我們求,我們假設最早買不到票的人編號是k,他手持的是100元並且售票處沒有錢,那麼將前k個人的錢從50元變成100元,從100元變成50元,這時候就有n+1個人手持50元,m-1個手持100元的,所以就得到,於是我們的結果就因此得到了,運算式是。
關於Catalan數的變形還有很多,本身組合數學就是一門十分有趣的學科,通過不停地分析,求解我們能夠不斷增加自己思維的嚴謹性和全面性。
(註:該篇非原創,只是覺得較其他關於Catalan數的講解較好而整理過來)