卡特兰数列

来源:互联网 发布:美国协同办公软件 编辑:程序博客网 时间:2024/04/29 10:06

由于最近怒刷笔试题遇到了很多关于卡特兰数列的问题于是写这篇文章,算是做个笔记吧。

1卡特兰数列的定义:
是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。
2卡特兰树列的前几项:
1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796。
3卡特兰数列的推导公式:
令h(0)=1,h(1)=1,catalan数满足递推式[1] :
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)
h(0) = 1;
h(2-1) = h(1) = 1;
h(1) = 1;
所以:h(2)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另类递推式[2] :
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,…)
4卡特兰数列的应用:
1矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
(h(n-1)种)
2一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
h(n+1)

3 买票找零

有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈

4凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。
f(n) = h(n-2);
5 一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

6在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

7给定N个节点,能构成多少种不同的二叉树?[7]

(能构成h(N)个)

(这个公式的下标是从h(0)=1开始的)
要注意平衡二叉树的节点增加数量是一个斐波那契数列 不要混淆。

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;
}
}

0 0