1. 程式人生 > >卡特蘭數[catalan數]`

卡特蘭數[catalan數]`

定義:

卡特蘭數又叫卡塔蘭數,是組合數學中一類常用的數列。前幾項為:1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...是組合數學中常見的一類數。

公式:

遞推式:設C(0) = 0, C(1) = 1.C(n) = C(0) * C(n - 1) + C(1) * C(n - 2) + ....C(n - 2) * C(1) + C(n - 1) * C(0).(n >= 2)

              化簡得 C(n) = c(2 * n, n) / (n + 1).

另類遞推式:C(n) = C(n - 1) * (4 * n - 2) / (n + 1).

              化簡得 C(n) = c(2 * n, n) - c(2 * n, n + 1).

應用:

卡特蘭數有很多的經典應用。不一一介紹,後序會提到。

1.買票問題:說n個拿著50元的人和n個拿著100元的人,買價值為50元的票,並且售票廳最初始的時候沒有任何的零錢可找。問有多少種排隊的方式使得買票沒有中斷。買票中斷意味著當前售票廳沒有零錢並且當前買票人的手裡是100元。 這是卡特蘭數其中經典的應用之一。

分析一:

其實,這個問題可以轉化為括號匹配問題來解決。。

我們可以把拿著50元的看成左括號' ( ' ,對應著把拿著100元的看成右括號 ' ) '。這樣我們的問題就轉化為求合法的括號匹配的排列數。

我們知道合法的括號匹配排列,首個肯定為左括號,否者該序列肯定不是合的。

如 (######)@@@@@@

上述符號,假設第0個和第 k是匹配的,如果該序列是合法的,那麼 1 - (k  - 1) 個字元肯定是合法的括號匹配排列。同理,如果該排列的長度為L,那麼(k + 1) - L也應該的一個合法的括號匹配排列。    由此我們可以知道k必定是一奇數。。

我們設F(2n) 為長度為2n的排列的合法數。。

那麼上訴的字串的合法數就為F(2n) = F(k - 2) * F(2n - k)。

看下圖:

分析二:

我們假設拿50元的人為1,拿100元的人為0。那麼2n個人就是n個1和n個0的數字序列。如果一個序列中的任意前k( 1 <= k <=n)項中1的個數不少於0的個數,那麼我們就稱為這個序列為合法序列,否則的話為非法數列。明顯的合法的數列正好和合法的排隊序列對應。。。

Sigma序列:由n - 1個1和n + 1個0組成的序列。。   而一個Sigma序列正好為一個非法序列對應。並且是一一對應。。

我們知道所有的排列序列為C(2n, n)。(為n個1選擇n位置,然後剩餘位置為0的位置)。

我們也是可以算出Sigma序列的種類數的,C(2n, n -1)。(同樣,要為1找n-1個位置,然後剩餘位置為0的位置)。

重要的是就是要理解為什麼Sigma數列和非法數列一一對應。。

對於任意的Sigma數列,我們知道一定存在一個k,前k個數的,1的個數-0的個數=1。那麼k後面的2n - k個數,1的個數-0的個數=1。如果將後面的2n - k個數對換,也就是說,後面的0變1,1變0。那麼整個序列正好為n個1和n個0。也就成功的將一個Sigma數列對應到唯一的一個非法序列。。

那麼最後就得到合法是序列為C(2 * n, n) - C(2 * n , n -1) = C(2 * n , n) / (n + 1)。也就是是第2*n個卡特蘭數。

卡特蘭數還有很多是應用。。

2.矩陣連乘問題:P =  a1 * a2 * a3 *.....* an。依據乘法結合律,不改變矩陣的互相順序,只用括號表示成對的乘積,問有幾種括號化的方案。C(n - 1)。

3.將多邊形劃分為三角形問題。求一凸變形區域劃分成三角形區域的方法數。n條邊種類數為C(n - 2),n個頂點種類數為C(n - 3)。

4.圓上的2n個點,將這點成對的連線起來,且所得的n條邊不相交,求可行的方法數。C(n)。

5.出棧順序問題,進棧順序為1,2,3,4,5.....n,問出棧順序的種類。。C(n)。

6.