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



你可能感兴趣的:(knowledge)