卡特蘭數應用

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

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

(7)標準二維表問題。設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).

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

不同形態的二叉樹的數目恰好是前序序列均爲1,2,3...n的二叉樹所能的到的中序序列的數目。
而中序遍歷的過程實質上是一個點進棧和出棧的過程。
二叉樹的形態確定了其節點進棧和出棧的順序,也確定了其中序序列
。因此這個問題就變成問題3.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章