卡特兰数问题

卡特兰数

  • 卡特兰数
    卡特兰数是组合数学中一个常出现在各种计数问题中的数列,最早由清代数学家明安图发现,也叫“明安图数”
    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(n1)+h(1)h(n2)+...+h(n1)h(0)(n>=2) h ( n ) = h ( 0 ) ⋅ h ( n − 1 ) + h ( 1 ) ⋅ h ( n − 2 ) + . . . + h ( n − 1 ) ⋅ h ( 0 ) ( n >= 2 )
  • 常见应用

    1. 括号化
      矩阵连乘: P=a1×a2×a3××an P = a 1 × a 2 × a 3 × … … × a n ,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?
    2. 出栈次序
      一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
    3. 凸多边形三角划分

      在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数?
    4. 给定节点组成二叉搜索树
      给定N个节点,能构成多少种不同的二叉搜索树?
    5. n n 对括号正确匹配数目
      给定 n n 对括号,求括号正确配对的字符串数,例如:
      0对括号:[空序列] 1种可能
      1对括号: () ( ) 1种可能
      2对括号: ()()(()) ( ) ( ) ( ( ) ) 2种可能
      3对括号: ((()))()(())()()()(())()(()()) ( ( ( ) ) ) ( ) ( ( ) ) ( ) ( ) ( ) ( ( ) ) ( ) ( ( ) ( ) ) 5种可能
      那么问题来了,n对括号有多少种正确配对的可能呢?
      考虑 n n 对括号时的任意一种配对方案,最后一个右括号有唯一的与之匹配的左括号,
      于是有唯一的表示A(B),其中A和B也是合法的括号匹配序列。
      假设 S(n) S ( n ) n n 对括号的正确配对数目,
      那么有递推关系 S(n)=S(0)S(n1)+S(1)S(n2)+...+S(n1)S(0) S ( n ) = S ( 0 ) S ( n − 1 ) + S ( 1 ) S ( n − 2 ) + . . . + S ( n − 1 ) S ( 0 ) ,显然 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];
    }
}

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