卡特兰数及其使用典型例子

卡特兰数是一个常用在计数情况中使用的一种特殊的数列,其原理如下:

一、原理

若令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)=1*2+1*1+2*1=5

二、通解

递推公式的通解:h(n)=C(2n,n)/n+1(或者C(2n,n)-C(2n,n+1)))

三、常用案例

1.求出栈次序

例:有一进栈顺序e1、e2、e3、e4、e5,求有多少可能的出栈序列。

分析:假设我们要求的出栈数为n,要得到的出栈序列为f(n),我们知道,因为入栈的顺序是确定的,假设入栈顺序记为1、2、3、4、5...n,那么假设最后出栈的那个数为第k个数,那么我们要求f(k)时,k-1个数已经先完成进栈出栈,此时有f(k-1)种方式,然后k之后的n-k个数也完成进栈和出栈,也就是f(n-k)种方式,最后第k个数出栈,此时的f(k)=f(k-1)*f(n-k),而每个数都可能是最后出栈的,也就是k的取值范围是从1到n,满足卡特兰数通式:


把n=5,带入公式即可求得f(5)=42

2.凸多边形划分

问题描述:在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。

思路:因为凸多边形的任意一条边必定属于某一个三角形,所以我们以某一条边为基准,以这条边的两个顶点为起点P1和终点Pn(P即Point),将该凸多边形的顶点依序标记为P1、P2、……、Pn,再在该凸多边形中找任意一个不属于这两个点的顶点Pk(2<=k<=n-1),来构成一个三角形,用这个三角形把一个凸多边形划分成两个凸多边形,其中一个凸多边形,是由P1,P2,……,Pk构成的凸k边形(顶点数即是边数),另一个凸多边形,是由Pk,Pk+1,……,Pn构成的凸n-k+1边形。此时,我们若把Pk视为确定一点,那么根据乘法原理,f(n)的问题就等价于——凸k多边形的划分方案数乘以凸n-k+1多边形的划分方案数,即选择Pk这个顶点的f(n)=f(k)×f(n-k+1)。而k可以选2到n-1,所以再根据加法原理,将k取不同值的划分方案相加,得到的总方案数为:f(n)=f(2)f(n-2+1)+f(3)f(n-3+1)+……+f(n-1)f(2)。看到此处,再看看卡特兰数的递推式,答案不言而喻,即为f(n)=h(n-2) (n=2,3,4,……)。

3.给定节点生成二叉树

给定n个节点,求能生成多少个不同形状的二叉树?

和第一个问题类似,如法炮制,很容易可以看得起满足f(0)=1,f(1)=1的卡特兰数


你可能感兴趣的:(算法)