Catalan數 卡特蘭數

2021-08-26 19:48:05 字數 3982 閱讀 1368

catalan數——卡特蘭數

今天阿里**筆試中碰到兩道組合數學題,感覺非常親切,但是筆試中失蹤推導不出來

後來查了下,原來是catalan數。悲劇啊,現在整理一下

一、catalan數的定義令h(1)=1,catalan數滿足遞迴式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2該遞推關係的解為:h(n) = c(2n-2,n-1)/n,n=1,2,3,...(其中c(2n-2,n-1)表示2n-2個中取n-1個的組合數)

問題描述:

12個高矮不同的人,排成兩排,每排必須是從矮到高排列,而且第二排比對應的第一排的人高,問排列方式有多少種?

這個筆試題,很yd,因為把某個遞推關係隱藏得很深。

問題分析:

我們先把這12個人從低到高排列,然後,選擇6個人排在第一排,那麼剩下的6個肯定是在第二排.

用0表示對應的人在第一排,用1表示對應的人在第二排,那麼含有6個0,6個1的序列,就對應一種方案.

比如000000111111就對應著

第一排:0 1 2 3 4 5

第二排:6 7 8 9 10 11

010101010101就對應著

第一排:0 2 4 6 8 10

第二排:1 3 5 7 9 11

問題轉換為,這樣的滿足條件的01序列有多少個。

觀察1的出現,我們考慮這乙個出現能不能放在第二排,顯然,在這個1之前出現的那些0,1對應的人

要麼是在這個1左邊,要麼是在這個1前面。而肯定要有乙個0的,在這個1前面,統計在這個1之前的0和1的個數。

也就是要求,0的個數大於1的個數。

ok,問題已經解決。

如果把0看成入棧操作,1看成出棧操作,就是說給定6個元素,合法的入棧出棧序列有多少個。

這就是catalan數,這裡只是用於棧,等價地描述還有,二叉樹的列舉、多邊形分成三角形的個數、圓括弧插入公式中的方法數,其通項是c(2n, n)/(n+1).

在《計算機程式設計藝術》,第三版,donald e.knuth著,蘇運霖譯,第一卷,508頁,給出了證明:

問題大意是用s表示入棧,x表示出棧,那麼合法的序列有多少個(s的個數為n)

顯然有c(2n, n)個含s,x各n個的序列,剩下的是計算不允許的序列數(它包含正確個數的s和x,但是違背其它條件).

在任何不允許的序列中,定出使得x的個數超過s的個數的第乙個x的位置。然後在導致幷包括這個x的部分序列中,以s代替所有的x並以x代表所有的s。結果是乙個有(n+1)個s和(n-1)個x的序列。反過來,對一垢一種型別的每個序列,我們都能逆轉這個過程,而且找出導致它的前一種型別的不允許序列。例如xxsxsssxxsss必然來自ssxs***xxsss。這個對應說明,不允許的序列的個數是c(2n, n-1),因此an = c(2n, n) - c(2n, n-1)。

驗證:其中f表示前排,b表示後排,在列舉出前排的人之後,對應的就是後排的人了,然後再驗證是不是滿足後面的比前面對應的人高的要求。

#include using namespace std;

int bit_cnt(int n)

int main(void)

{ int f[6], b[6];

int i,j,k,state,ok,ans = 0;

for (state = 0; state < (1 << 12); ++state)

{ if (bit_cnt(state) == 6)

{ i = j = 0;

for (int k = 0; k < 12; ++k)

{if(state&(1結果:132

而c(12, 6)/7 = 12*11*10*9*8*7/(7*6*5*4*3*2) = 132

注意:c(2n, n)/(n+1) = c(2n, n) - c(2n, n-1)

估計出題的人也讀過《電腦程式藝術》吧。

ps:另乙個很yd的問題:

有編號為1到n(n可以很大,不妨在這裡假定可以達到10億)的若干個格仔,從左到右排列。

在某些格仔中有乙個棋子,不妨設第xi格有棋子(1<=i<=k, 1<=k<=n)

每次乙個人可以把乙個棋子往左移若干步,但是不能跨越其它棋子,也要保證每個格仔至多只有乙個棋子。

兩個人輪流移動,移動不了的為輸,問先手是不是有必勝策略。

三、catalan數的典型應用:

1、括號化問題。矩陣鏈乘: p=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?

乙個有n個x和n個y組成的字串,且所有的部分字串皆滿足x的個數大於等於y的個數。以下為長度為6的dyck words:

***yyy xyxxyy xyxyxy xxyyxy xxyxyy

將上例的x換成左括號,y換成右括號,cn表示所有包含n組括號的合法表示式的個數:

((())) ()(()) ()()() (())() (()())

2、將多邊行劃分為三角形問題。將乙個凸多邊形區域分成三角形區域(劃分線不交叉)的方法數?

類似:在圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?

3、出棧次序問題。乙個棧(無窮大)的進棧序列為1、2、3、...、n,有多少個不同的出棧序列?

類似:有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)

類似:一位大城市的律師在他住所以北n個街區和以東n個街區處工作,每天她走2n個街區去上班。如果他從不穿越(但可以碰到)從家到辦公室的對角線,那麼有多少條可能的道路?

分析:對於每乙個數來說,必須進棧一次、出棧一次。我們把進棧設為狀態『1』,出棧設為狀態『0』。n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1‥n的順序排列、入棧的運算元b大於等於出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃瞄由n個1和n個0組成的2n位二進位制數,1的累計數不小於0的累計數的方案種數。

4、給頂節點組成二叉樹的問題。

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

(一定是二叉樹!先去乙個點作為頂點,然後左邊依次可以取0至n-1個相對應的,右邊是n-1到0個,兩兩配對相乘,就是h(0)*h(n-1)+h(2)*h(n-2)+ ...... +h(n-1)h(0)=h(n)) (能構成h(n)個)

在2n位二進位制數中填入n個1的方案數為c(2n,n),不填1的其餘n位自動填0。從中減去不符合要求(由左而右掃瞄,0的累計數大於1的累計數)的方案數即為所求。

不符合要求的數的特徵是由左而右掃瞄時,必然在某一奇數字2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即乙個不合要求的數對應於乙個由n+1個0和n-1個1組成的排列。

反過來,任何乙個由n+1個0和n-1個1組成的2n位二進位制數,由於0的個數多2個,2n為偶數,故必在某乙個奇數字上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應乙個不符合要求的數。

因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應。

顯然,不符合要求的方案數為c(2n,n+1)。由此得出輸出序列的總數目=c(2n,n)-c(2n,n+1)=1/(n+1)*c(2n,n)。

(這個公式的下標是從h(0)=1開始的)

Catalan數(卡特蘭數)

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...

卡特蘭數 Catalan數

卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58786,h 12 208012,h 13 742900,h 14 2674440,h 15 969484...

Catalan數(卡特蘭數)

2012 04 12 21 08 13 標籤 卡特蘭數 原始出處 作者資訊和本宣告。否則將追究法律責任。卡特蘭數 規定h 0 1,而h 1 1,h 2 2,h 3 5,h 4 14,h 5 42,h 6 132,h 7 429,h 8 1430,h 9 4862,h 10 16796,h 11 58...