Catalan Number (卡特蘭數)

1. 什麼是卡特蘭數(Catalan Number)?

Catalan Number 是一組有規律的數列,由比利時叫什麼什麼卡特蘭的數學家的名字命名的。它是怎樣的一組數列呢?

1, 2, 5, 14, 132, 429。。。。。。


2. 原理

令h(0) = 1, h(1) = 1, catalan數滿足遞推式:

h(n) = h(0)*h(n-1) + h(1)*h(n-2) + ...... + h(n-1)h(0) (n>=2)

h(2) = h(0)*h(1) + h(1)* h(0) = 1 * 1 + 1 * 1 = 2;

h(3) = h(0)*h(2) + h(1) * h(1) + h(2) * h(0) = 5;


另類 遞推式: 

h(n) = h(n - 1) * (4*n - 2) /(n+ 1);

遞推關係的解爲:

h(n) = C(2n, n) /(n + 1) (n = 0, 1, 2, ....)

遞推關係的另類解爲:

h(n) = C(2n, n) - C(2n, n + 1)  (n = 0, 1, 2, 3, ...)


3. 應用

括號化: 矩陣連乘:P = a1 * a2 * a3 *.....* an, 根據乘法結合律,不改變順序, 只用括號不是成對的乘積,有h(n-1) 種方案。

一個棧(無窮大)的進棧序列爲1,2,3,4, .... 有多少種不同的出棧序列?h(n + 1);

凸多邊形 三角劃分: 

給定節點組成二叉樹


4. C++

void catalan() //求卡特蘭數
{
    int i, j, len, carry, temp;
    a[1][0] = b[1] = 1;
    len = 1;
    for(i = 2; i <= 100; i++)
    {
        for(j = 0; j < len; j++) //乘法
        a[i][j] = a[i-1][j]*(4*(i-1)+2);
        carry = 0;
        for(j = 0; j < len; j++) //處理相乘結果
        {
            temp = a[i][j] + carry;
            a[i][j] = temp % 10;
            carry = temp / 10;
        }
        while(carry) //進位處理
        {
            a[i][len++] = carry % 10;
            carry /= 10;
        }
        carry = 0;
        for(j = len-1; j >= 0; j--) //除法
        {
            temp = carry*10 + a[i][j];
            a[i][j] = temp/(i+1);
            carry = temp%(i+1);
        }
        while(!a[i][len-1]) //高位零處理
        len --;
        b[i] = len;
    }
}

Reference:http://baike.baidu.com/view/2499752.htm



發佈了84 篇原創文章 · 獲贊 1 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章