1. 程式人生 > >卡特蘭數及其使用典型例子

卡特蘭數及其使用典型例子

卡特蘭數是一個常用在計數情況中使用的一種特殊的數列,其原理如下:

一、原理

若令h(0)=1,h(1)=1,catalan數滿足遞推式:

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)(可以寫成通式:

)

例:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2

h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5

二、通解

遞推公式的通解:h(n)=C(2n,n)/n+1(或者C(2n,n)-C(2n,n+1)))

三、常用案例

1.求出棧次序

例:有一進棧順序e1、e2、e3、e4、e5,求有多少可能的出棧序列。

分析:假設我們要求的出棧數為n,要得到的出棧序列為f(n),我們知道,因為入棧的順序是確定的,假設入棧順序記為1、2、3、4、5...n,那麼假設最後出棧的那個數為第k個數,那麼我們要求f(k)時,k-1個數已經先完成進棧出棧,此時有f(k-1)種方式,然後k之後的n-k個數也完成進棧和出棧,也就是f(n-k)種方式,最後第k個數出棧,此時的f(k)=f(k-1)*f(n-k),而每個數都可能是最後出棧的,也就是k的取值範圍是從1到n,滿足卡特蘭數通式:

把n=5,帶入公式即可求得f(5)=42

2.凸多邊形劃分

問題描述:在一個凸多邊形中,通過若干條互不相交的對角線,把這個多邊形劃分成了若干個三角形。任務是鍵盤上輸入凸多邊形的邊數n,求不同劃分的方案數f(n)。比如當n=6時,f(6)=14。

思路:因為凸多邊形的任意一條邊必定屬於某一個三角形,所以我們以某一條邊為基準,以這條邊的兩個頂點為起點P1和終點Pn(P即Point),將該凸多邊形的頂點依序標記為P1、P2、……、Pn,再在該凸多邊形中找任意一個不屬於這兩個點的頂點Pk(2<=k<=n-1),來構成一個三角形,用這個三角形把一個凸多邊形劃分成兩個凸多邊形,其中一個凸多邊形,是由P1,P2,……,Pk構成的凸k邊形(頂點數即是邊數),另一個凸多邊形,是由Pk,Pk+1,……,Pn構成的凸n-k+1邊形。此時,我們若把Pk視為確定一點,那麼根據乘法原理,f(n)的問題就等價於——凸k多邊形的劃分方案數乘以凸n-k+1多邊形的劃分方案數,即選擇Pk這個頂點的f(n)=f(k)×f(n-k+1)。而k可以選2到n-1,所以再根據加法原理,將k取不同值的劃分方案相加,得到的總方案數為:f(n)=f(2)f(n-2+1)+f(3)f(n-3+1)+……+f(n-1)f(2)。看到此處,再看看卡特蘭數的遞推式,答案不言而喻,即為f(n)=h(n-2) (n=2,3,4,……)。

3.給定節點生成二叉樹

給定n個節點,求能生成多少個不同形狀的二叉樹?

和第一個問題類似,如法炮製,很容易可以看得起滿足f(0)=1,f(1)=1的卡特蘭數