zoukankan      html  css  js  c++  java
  • Catalan数

    一、定义

      Catalan数是组合数学中在经常出现在计数问题中的数列,前几项为:

      (1,2 , 5 ,14,42,132,429,1430,4862,16796,58786,208012,742900,……)

    二、求解公式

      Catalan数有(4)个常用的求解公式

      (①)递归公式1

    [f(n)=sum_{i=1}^{n-1}f(i)*f(n-i-1) ]

      (②)递归公式2

    [f(n)=frac{f(n-1)*(4*n-2)}{n+1} ]

      (③)组合公式1

    [f(n)=frac{C_{2n}^n}{n+1} ]

      (④)组合公式2

    [f(n)=C_{2n}^n-C_{2n}^{n-1} ]

    例1 二叉树计数

      已知一个二叉树有n个节点,求该二叉树有多少种不同的形态。

      定一个点为根,假设左子树有(i)个节点,右子树有((n-i-1))个节点,那么根据乘法原理把他乘起来即可。我们设f(n)为n个节点的不同的二叉树形态个数,那么答案为:

    [f(n)=sum_{i=1}^{n-1}f(i)*f(n-i-1) ]

      这显然就是Catalan数,用组合公式求解即可。

    例2 AB排列问题

      有(n)(A)(n)(B)排在一起,要求从(1)开始的任意位置(B)的个数不能超过(A)的个数,求方案数。

      直接求解满足条件的比较复杂,我们考虑求不符合条件的情况

      令(n)(A)(n)(B)组成的序列(S)不满足条件,那么我们就必定可以找到一个位置(p)满足(S[1...2p+1])中有(p+1)(B),(p)(A)。我们将(S[2p+2...2n])的所有(A)(B)(B)(A),可以得到一个由(n-1)(n+1)个B,(n-1)(A)组成的序列。

      相应的,对于一个由(n-1)(n+1)个B,(n-1)(A)组成的序列,我们必定可以找到一个位置(p)满足(S[1...2p+1])(p+1)(B)(p)(A)。把(S)剩下的转换之后,就得到一个由(n)(A)(n)(B)组成的、存在一个前缀为(B)(A)多的序列。

      因此,这两个序列形成了一个双射,或者它们一一对应。

      所以,根据组合数定义,符合条件的排列的个数为:

    [C_{2n}^n-C_{2n}^{n-1}=frac{C_{2n}^n}{n+1}=Cat_n ]

    例3 乘法加括号

      对于连乘(a_1*a_2*a_3*···*a_n),可以通过加括号改变它的运算顺序,求有多少种运算顺序。

      我们考虑把每一个数和符号都作为二叉树的节点,保证每个数都是二叉树的叶子节点,那么每次就是选择一个(*)使得左边形成一棵二叉树,右边一棵。相当于把求的顺序分为前(pos)个和后(pos)个分开处理,答案也就是二叉树计数。

    例4 欧拉多边形的划分

      给出凸(n)边形的边数,求有多少种分法可以把这个多边形分成互不重叠的(n-2)个三角形。

      我们假定已经选择了一条边,那么一这条边必定会形成一个三角形的一边,而这个三角形也把这个多边形分成了两个多边形,我们设(H_n)(n)边形的分割数,那么容易得到:

    [H_n=H_{n-1}+H_3H_{n-2}+···+H_{n-2}H_3+H_{n-1} ]

      我们再假设确定了一条对角线,把(n)边形分成两个多边形,边数之和为(n+2),而从一个顶点出发的(n-3)条对角线所形成的分割数为:(H_3H_{n-1}+H_4H_{n-2}+···+H_4H_{n-2}+H_3H_{n-1}),由于一条对角线有两个端点,重复计数两次,而每个分割实际重复统计了(n-3)次,所以从所有顶点出发的n边形划分数为:

    [(n-3)H_n=frac{n(H_3H_{n-1}+H_4H_{n-2}+···+H_4H_{n-2}+H_3H_{n-1})}{2} ]

      联立两个式子得到:

    [H_{n+1}=(frac{4n-6}{n})H_n ]

      而这也是(Catalan)数的公式之一,所以可知(H_n=Cat_{n-2})

  • 相关阅读:
    文件较验及Google Gson的使用
    SQLite数据库操作
    错误收集
    【记录】Linux安装JDK详细步骤
    【原创】RPM安装软件时解决依赖性问题(自动解决依赖型)
    【原创】rman备份出现ORA-19625
    【原创】rman 全库备份脚本
    【原创】TimeSten安装与配置
    【原创】查询占CPU高的oracle进程
    【参考】查找Oracle最高的几个等待事件以及锁的信息
  • 原文地址:https://www.cnblogs.com/fangbozhen/p/11761948.html
Copyright © 2011-2022 走看看