Catalan Number 卡特兰数

卡特兰数是一个比较有意思的数列,有几个经典问题的模型如下:

1.n对括号的合法表达式有多少种可能,其中答案为C(n) (表示卡特兰数列的第n项)。

2.有n个节点的二叉树的所有可能形态有多少种,也是C(n)。

3.计算有n+1个叶节点的满二叉树有多少种,也是C(n)。

4.序列{1, 2, 3, ....., n}的所有排列中不出现 123 或者任何一个长度为三的指定序列的所有可能数。

5.把n+2边形划分成三角形(连接不相邻顶点并且使得n+2边形被划分后只有三角形)的所有可能数。

......

Catalan Number 卡特兰数_第1张图片

其中卡特兰数的前几项如下:

1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, …


卡特兰数求法:

1. 递归形式:

catalan

采用该方法计算第n项卡特兰数的时间复杂度为:

catalan2

2.动态规划:

#include
using namespace std;
 
// A dynamic programming based function to find nth
// Catalan number
unsigned long int catalanDP(unsigned int n)
{
    // Table to store results of subproblems
    unsigned long int catalan[n+1];
 
    // Initialize first two values in table
    catalan[0] = catalan[1] = 1;
 
    // Fill entries in catalan[] using recursive formula
    for (int i=2; i<=n; i++)
    {
        catalan[i] = 0;
        for (int j=0; j

时间复杂度 O(n^2)


3.用二项式系数辅助求法:

catalan3

复杂度 O(n)

还可以用:

catalan4

#include
using namespace std;
 
// Returns value of Binomial Coefficient C(n, k)
unsigned long int binomialCoeff(unsigned int n, unsigned int k)
{
    unsigned long int res = 1;
 
    // Since C(n, k) = C(n, n-k)
    if (k > n - k)
        k = n - k;
 
    // Calculate value of [n*(n-1)*---*(n-k+1)] / [k*(k-1)*---*1]
    for (int i = 0; i < k; ++i)
    {
        res *= (n - i);
        res /= (i + 1);
    }
 
    return res;
}
 
// A Binomial coefficient based function to find nth catalan
// number in O(n) time
unsigned long int catalan(unsigned int n)
{
    // Calculate value of 2nCn
    unsigned long int c = binomialCoeff(2*n, n);
 
    // return 2nCn/(n+1)
    return c/(n+1);
}
 
// Driver program to test above functions
int main()
{
    for (int i = 0; i < 10; i++)
        cout << catalan(i) << " ";
    return 0;
}


本文参考自:http://www.geeksforgeeks.org/program-nth-catalan-number/

文中代码均来自此网址!

你可能感兴趣的:(Mathematics)