目的
用于解决一些有(qi)趣(guai)的问题,如:括号匹配问题,凸多边形划分问题,二叉树种类问题等。递推方程为hn=ni=1hi1×hni
为什么凸多边形划分的方案数是Catalan数?
设有一个凸x边形,选择一条边,作一个以这条边为一边的三角形,那么这样就将原x边形分成了三部分:一个m边形,一个三角形,一个xm+1边形,那么递推方程为fi=i2j=2fj×fij+1
为什么括号匹配的方案数是Catalan数?
括号匹配问题:给你n个左括号,n个右括号,组成一个序列,求合法序列的方案数。
由于最后一个位置一定是一个右括号,那么可以将这个括号与之前的某一个左括号对应起来,因此一个合法的序列A一定可以表示成一个序列B(C),其中BC是合法的序列,那么递推方程就是开头给出的那个方程。
为什么一个节点数固定的二叉搜索树的种类是Catalan数?
印点一个节点为根,那么他的左右儿子也一定是一棵合法的二叉搜索树,因此递推方程也是开头给出的那个。
说到这里,Catalan数递推的时间复杂度仍然是O(n2)的,那么有没有通项公式呢?
其实是有的,hi=Cn2nCn12n1=Cn2nn+1C是组合数。
证明?
以括号匹配问题为例,假设有一个二进制序列,一共2n项,其中0代表一个右括号,1代表一个左括号。
显然,这个二进制序列一共有Cn2n种排列方式,减去不合法序列的方案数就是卡特兰数的通项公式了。
假设有一个不合法序列,那么必定有一项2m+1,其中前2m项有m0m1,而2m+1项是0,将(2m+2)..2n这些位置全部异或1,那样这样一个序列将是一个有n+10n11的序列,同时一个有n+10n11的序列经过同样的过程也可以变成一个不合法序列。这样就证明了一个不合法的序列和一个有n+10n11的序列构成了一一对应。而显然,这种序列有Cn12n种,所以hn=Cn2nCn12n
很显然,这个公式也可以变成hn=Cn2nn+1,那么这个通项公式即可得到证明。