Catalan數計算及應用

orchid發表於2013-09-07

Catalan數列是非常奇妙的一列數字,因為很多問題的解就是一個Catalan數。知道了這一規律,很多看似複雜的問題便可迎刃而解。那麼什麼是Catalan數,什麼樣的問題的解是Catalan數呢?

1,Catalan數

先來看一段Catalan數列:1,1,2,5,14,42,132,429,1430,4862,16796,即 h(0)=1,h(1)=1,h(2)=2,h(3)=5...

怎麼求出來的呢?兩種方式

(1) h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0). 這是一個遞迴的公式。

(2) h(n)=c(n2,n)/(n+1). 由這個公式可以直接求出h(n),不需要知道h(n-1)...h(0).

在直接想要知道h(n)的時候,公式(2)很好用,但是在解決一些演算法問題的時候,第一個公式更有用些,因為這一類演算法全都能搞成公式(1)的樣子求解。

2,Catalan數的應用

(1) n對括號有多少種匹配方式?

比如一對括號肯定有一種匹配方式(),兩對括號呢,兩種()()和(()),n對呢?

可以用分治的思想來。假設第一個(可以和i個)匹配了,即(...)...這個樣子,那麼整個大問題可以分成兩個子問題,這種情況下有多少個配對等於紅色點點部分的子問題有的配對數目乘以綠色點點部分的子問題配對數目。所有的匹配數目就等於所有有第一個括號配對的選擇而帶來的子問題的解的和。即n對括號匹配數目f(n)為,

f(n)=f(0)*f(n-1)+f(1)*f(n-1)+...+f(n-1)*f(0)

怎麼理解?

f(0)*f(n-1)就是:()...第一個(與第一個)配對了,產生的兩個子問題就是左邊的0對括號的匹配和右面n-1對的括號的匹配。

f(1)*f(n-1)就是:(())..第一個(與第二個)配對了,產生的子問題就是左邊的1對括號的匹配和右面n-2對括號的匹配。

而這個f(n)的公式是不是就是Catalan的遞迴公式呢?完全相同,因此n對括號的匹配數就是Catalan數h(n).

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

也是分治的思想,先通過一個括號將大問題分成小問題。比如(a1×a2)×(a3×a4×a5×a6...),然後再解決兩個小問題的括號化問題。所以n個矩陣相乘的括號方案f(n)可以表達為

f(n)=f(1)*f(n-1)+f(2)*f(n-2)+...+f(n-1)*f(1).

所以f(n)=h(n-1)

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

進棧相當於左括號,出棧相當於右括號,這個問題和問題1是等價的。比如,123的進棧出棧序列可以表示為112332,紅色表示進棧,綠色表示出棧,紅色的對應(,綠色對應)。那麼這個序列其實就是()(()).

所以這個問題的解還是h(n).

(4)n個節點構成的二叉樹,共有多少種情形?

 有n個節點,這些節點的值不重要,重要的是如果選擇第i個節點作為樹的根,那麼這棵樹的左子樹就會有i-1個節點,右子樹就會有n-i-1個節點。

所以總共可能的二叉樹有

f(n)=f(0)*f(n-1)+f(1)*f(n-2)....+f(n-1)*f(0)

也是Catalan數h(n)

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

以其中一個點為基點,編號為0,然後按順時針方向將其他點依次編號。那麼與編號為0相連點的編號一定是奇數,否則,這兩個編號間含有奇數個點,勢必會有個點被孤立,即在一條線段的兩側分別有一個孤立點,從而導致兩線段相交。設選中的基點為A,與它連線的點為B,那麼A和B將所有點分成兩個部分,一部分位於A、B的左邊,另一部分位於A、B的右邊。然後分別對這兩部分求解即可。所以,

f(n) = f(0)*f(n-2) + f(2)*f(n-4) + f(4)*f(n-6) + ......f(n-4)*f(2) + f(n-2)*f(0)。

(0)*f(n-2)表示編號0的點與編號1的點相連,此時位於它們右邊的點的個數為0,而位於它們左邊的點為2n-2。依次類推。

f(0) = 1, f(2) = 1, f(4) = 2。結合遞迴式,不難發現f(2n) 等於h(n)。

(6)求一個凸多邊形區域劃分成三角形區域的方法數?

設凸邊行為ABCDEF...,以凸多邊形的一邊為基,設這條邊的2個頂點為A和B。從剩餘頂點中選1個記為X,可以將凸多邊形分成三個部分,中間是一個三角形(ABX),左右兩邊分別是兩個凸多邊形(B(BX之間的點)X,AX(從X到A的點)),然後求解左右兩個凸多邊形。

設問題的解f(n),其中n表示頂點數,那麼f(n) = f(2)*f(n-1) + f(3)*f(n-2) + ......f(n-2)*f(3) + f(n-1)*f(2)。f(2)*f(n-1)表示三個相鄰的頂點構成一個三角形,那麼另外兩個部分的頂點數分別為2和n-1。

      設f(2) = 1,那麼f(3) = 1, f(4) = 2, f(5) = 5。結合遞推式,不難發現f(n) 等於h(n-2)

(7) 有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?

5元的人來是一個進棧,10元的人來是一個出棧。如果這個問題只考慮進棧和出棧的方式,不考慮具體的人,那麼應該有h(n)中安排方式。也可以就考慮這些5元錢,它們總是要都進來一遍,然後又會全出的。

(8)標準二維表問題。設n是一個正整數,2×n的標準二維表是有正整數1,2,...,2n組成的2×n陣列,該陣列的每行從左到右遞增,每列從上到下遞增。2×n的標準二維表全體記為Tab(n)。例如當n=3時,Tab(3)二維表如下圖所示:

1 2 3  1 2 4  1 2 5  1 3 4  1 3 5

4 5 6    3 5 6  3 4 6  2 5 6  2 4 6

這個問題可以轉為為問題(1)。對每個配對的括號從左到右編號,左括號對應的編號放在第一行,右括號對應的編號放在第二行,因為編號從左到右按照順序,而且右括號的編號肯定比左括號的編號大。比如:()()()對應[1 3 5][2 4 6]這個表,()(())對應[1 3 4][2 5 6]這個表。

因此Tab(n)=h(n).

(9)n個節點的二叉樹的不同形態的個數

 不同形態的二叉樹的數目恰好是前序序列均為1,2,3...n的二叉樹所能的到的中序序列的數目。而中序遍歷的過程實質上是一個點進棧和出棧的過程。二叉樹的形態確定了其節點進棧和出棧的順序,也確定了其中序序列。因此這個問題就變成問題3.

 

 

 

 

 

 

相關文章