1. 程式人生 > >程式設計師數學--卡特蘭數(Catalan number)

程式設計師數學--卡特蘭數(Catalan number)

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

我們可以先把這10個人從低到高排列,然後,選擇5個人排在第一排,那麼剩下的5個人肯定是在第二排。用0表示對應的人在第一排,用1表示對應的人在第二排,那麼含有5個0,5個1的序列,就對應一種方案。

比如0000011111就對應著
第一排:0 1 2 3 4 
第二排:5 6 7 8 9 
0101010101就對應著
第一排:0 2 4 6 8
第二排:1 3 5 7 9
所以,看到問題相應的轉換為,這樣的滿足條件的01序列有多少個。
觀察規律我們發現1的出現前邊必須有一個相應的0對應,所以從左到右的所有序列中
0的個數要一直大於1的個數。那這種數列有多少種排列方式呢?

那麼我們從左往右掃描,第一次出現1的個數等於0的個數是第k位,那麼在此之前,0的個數是大於1的個數的。在此之後,0的個數也是大於1的個數的。所以第k位0和1的個數第一次相等的排列有他們這兩部分的個數相稱的結果。那麼所有的k有多少種,則把它們相加起來,就是最後的排列數。這是一個遞迴的問題。即   

a(n)=a(0)×a(n-1)+a(1)*a(n-2)+...+a(n-1)*a(0)

卡特蘭數非常經典,很多現實的問題都是卡特蘭數,如合法的入棧出棧序列有多少種就是卡特蘭數,為什麼呢?我們可以把0看成入棧操作,1看成出棧操作,即0的累計個數不小於1的排列有多少種。還有很多其他的問題都是卡特蘭數,如二叉樹的個數,有序樹的個數,多邊形分成三角形的個數等。

卡特蘭數的通項是c(2n, n)/(n+1)。

注意組合數學中的運算:A(m, n) = m! / (m-n)!,    C(m, n) = A(m, n) / n! = m! / ((m-n)!*n!),因此卡特蘭數的通項:

         C(2n, n)/(n+1) = (2n!) / ((2n - n)! * n!)  / (n + 1) = (2n!) / (n! * n!) / (n + 1)

卡特蘭數的問題應用:

  1. 圓周上有標號為1,2,3,4,……,2n的共計2n個點,這2n個點配對可連成n條弦,且這些弦兩兩不相交的方式數為卡特蘭數Cn
  2. 遊樂園門票1元一張,每人限購一張。現在有10個小朋友排隊購票,其中5個小朋友每人只有1元的鈔票一張,另5個小朋友每人只有2元的鈔票一張,售票員沒有準備零錢。問:有多少種排隊方法,使售票員總能找的開零錢?

  3. 甲乙兩人比賽乒乓球,最後結果為20∶20,問比賽過程中甲始終領先乙的計分情形的種數。

    即甲在得到1分到19分的過程中始終領先乙,其種數是卡特蘭數



  4. 飯後,姐姐洗碗,妹妹把姐姐洗過的碗一個一個放進碗櫥摞成一摞。一共有n個不同的碗,洗前也是摞成一摞的,也許因為小妹貪玩而使碗拿進碗櫥不及時,姐姐則把洗過的碗摞在旁邊,問:小妹摞起的碗有多少種可能的方式?

    答:得數是第n個卡特蘭數Cn

一個汽車隊在狹窄的路面上行駛,不得超車,但可以進入一個死衚衕去加油,然後再插隊行駛,共有n輛汽車,問共有多少種不同的方式使得車隊開出城去?

  1. 括號化問題。一個合法的表示式由()包圍,()可以巢狀和連線,如(())()也是合法 表示式;現在有 6 對(),它們可以組成的合法表示式的個數為

  2. 矩陣連乘: P=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?(h(n)種)

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

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

  5. 將多邊行劃分為三角形問題。將一個凸N+2多邊形區域分成三角形區域的方法數?類似:一位大城市的律師在她住所以北n個街區和以東n個街區處工作。每天她走2n個街區去上班。如果她從不穿越(但可以碰到)從家到辦公室的對角線,那麼有多少條可能的道路?類似:在圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?

  6. 給頂節點組成二叉樹的問題。給定N個節點,能構成多少種不同的二叉樹,(能構成h(N)個)Catalan數的解法Catalan數的組合公式為 Cn=C(2n,n) / (n+1);

  7. 此數的遞迴公式為 h(n ) = h(n-1)*(4*n-2) / (n+1)

    卡特蘭數真是一個神奇的數字,很多組合問題的數量都和它有關係,例如:

    Cn= n對括號正確匹配組成的字串數,例如 3對括號能夠組成:

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

    Cn= n+1個數相乘,所有的括號方案數。例如, 4個數相乘的括號方案為:

    ((ab)c)d (a(bc))d (ab)(cd) a((bc)d) a(b(cd))

    Cn= 擁有 n+1 個葉子節點的二叉樹的數量。例如 4個葉子節點的所有二叉樹形態:

    卡特蘭數 - lz_666888 - lz_666888的部落格

    • Cn=n*n的方格地圖中,從一個角到另外一個角,不跨越對角線的路徑數,例如, 4×4方格地圖中的路徑有:

    卡特蘭數 - lz_666888 - lz_666888的部落格

    • Cn= n+2條邊的多邊形,能被分割成三角形的方案數,例如 6邊型的分割方案有:

    卡特蘭數 - lz_666888 - lz_666888的部落格

    • Cn= 圓桌周圍有 2n個人,他們兩兩握手,但沒有交叉的方案數。

    下面是一些大公司的筆試題

    先來一道阿里巴巴的筆試題目:說16個人按順序去買燒餅,其中8個人每人身上只有一張5塊錢,另外8個人每人身上只有一張10塊錢。燒餅5塊一個,開始時燒餅店老闆身上沒有錢。16個顧客互相不通氣,每人只買一個。問這16個人共有多少種排列方法能避免找不開錢的情況出現。

    C8=1430,所以總數=1430*8!*8!

    2012騰訊實習招聘筆試題

    在圖書館一共6個人在排隊,3個還《面試寶典》一書,3個在借《面試寶典》一書,圖書館此時沒有了面試寶典了,求他們排隊的總數?

    C3=5;所以總數為5*3!*3!=180.