卡特兰数
- 卡特兰数
卡特兰数是组合数学中一个常出现在各种计数问题中的数列,最早由清代数学家明安图发现,也叫“明安图数”
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012 ...
一般通项公式为
Cn=1n+1(2nn)=(2n)!(n+1)!n! C n = 1 n + 1 ( 2 n n ) = ( 2 n ) ! ( n + 1 ) ! n !
令 h(0)=1,h(1)=1 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 ( n ) = h ( 0 ) ⋅ h ( n − 1 ) + h ( 1 ) ⋅ h ( n − 2 ) + . . . + h ( n − 1 ) ⋅ h ( 0 ) ( n >= 2 ) 常见应用
- 括号化
矩阵连乘: P=a1×a2×a3×……×an P = a 1 × a 2 × a 3 × … … × a n ,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案? - 出栈次序
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列? - 凸多边形三角划分
在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数? - 给定节点组成二叉搜索树
给定N个节点,能构成多少种不同的二叉搜索树? -
n
n
对括号正确匹配数目
给定 对括号,求括号正确配对的字符串数,例如:
0对括号:[空序列] 1种可能
1对括号: () ( ) 1种可能
2对括号: ()()(()) ( ) ( ) ( ( ) ) 2种可能
3对括号: ((()))()(())()()()(())()(()()) ( ( ( ) ) ) ( ) ( ( ) ) ( ) ( ) ( ) ( ( ) ) ( ) ( ( ) ( ) ) 5种可能
那么问题来了,n对括号有多少种正确配对的可能呢?
考虑 n n 对括号时的任意一种配对方案,最后一个右括号有唯一的与之匹配的左括号,
于是有唯一的表示A(B),其中A和B也是合法的括号匹配序列。
假设 为 n n 对括号的正确配对数目,
那么有递推关系 ,显然 S(n) S ( n ) 是卡特兰数。
- 括号化
计算卡特兰数
一般算法:
public class Catalan {
public static void main(String[] args){
System.out.println(generateCatalan(3));
}
public static long generateCatalan(int n) {
//产生卡特兰数
long[] catalan = new long[n + 1];
catalan[0] = 1L;
catalan[1] = 1L;
for(int i = 2;i <= n; i++){
for(int j = 0; j < i; j++){
catalan[i] += catalan[j] * catalan[i-j-1];
}
}
return catalan[n];
}
}