Catalan数列是非常奇妙的一列数字,因为很多问题的解就是一个Catalan数。知道了这一规律,很多看似复杂的问题便可迎刃而解。那么什么是Catalan数,什么样的问题的解是Catalan数呢?

1,Catalan数

先来看一段Catalan数列:1,1,2,5,14,42,132,429,1430,4862,16796,即 h(0)=1,h(1)=1,h(2)=2,h(3)=5...

怎么求出来的呢?两种方式

(1) h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0). 这是一个递归的公式。

(2) h(n)=c(n2,n)/(n+1). 由这个公式可以直接求出h(n),不需要知道h(n-1)...h(0).

在直接想要知道h(n)的时候,公式(2)很好用,但是在解决一些算法问题的时候,第一个公式更有用些,因为这一类算法全都能搞成公式(1)的样子求解。

2,Catalan数的应用

(1) n对括号有多少种匹配方式?

比如一对括号肯定有一种匹配方式(),两对括号呢,两种()()和(()),n对呢?

可以用分治的思想来。假设第一个(可以和i个)匹配了,即(...)...这个样子,那么整个大问题可以分成两个子问题,这种情况下有多少个配对等于红色点点部分的子问题有的配对数目乘以绿色点点部分的子问题配对数目。所有的匹配数目就等于所有有第一个括号配对的选择而带来的子问题的解的和。即n对括号匹配数目f(n)为,

f(n)=f(0)*f(n-1)+f(1)*f(n-1)+...+f(n-1)*f(0)

怎么理解?

f(0)*f(n-1)就是:()...第一个(与第一个)配对了,产生的两个子问题就是左边的0对括号的匹配和右面n-1对的括号的匹配。

f(1)*f(n-1)就是:(())..第一个(与第二个)配对了,产生的子问题就是左边的1对括号的匹配和右面n-2对括号的匹配。

而这个f(n)的公式是不是就是Catalan的递归公式呢?完全相同,因此n对括号的匹配数就是Catalan数h(n).

(2) 矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?

也是分治的思想,先通过一个括号将大问题分成小问题。比如(a1×a2)×(a3×a4×a5×a6...),然后再解决两个小问题的括号化问题。所以n个矩阵相乘的括号方案f(n)可以表达为

f(n)=f(1)*f(n-1)+f(2)*f(n-2)+...+f(n-1)*f(1).

所以f(n)=h(n-1)

(3) 一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?

进栈相当于左括号,出栈相当于右括号,这个问题和问题1是等价的。比如,123的进栈出栈序列可以表示为32,红色表示进栈,绿色表示出栈,红色的对应(,绿色对应)。那么这个序列其实就是()(()).

所以这个问题的解还是h(n).

(4)n个节点构成的二叉树,共有多少种情形?

有n个节点,这些节点的值不重要,重要的是如果选择第i个节点作为树的根,那么这棵树的左子树就会有i-1个节点,右子树就会有n-i-1个节点。

所以总共可能的二叉树有

f(n)=f(0)*f(n-1)+f(1)*f(n-2)....+f(n-1)*f(0)

也是Catalan数h(n)

(5)在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

以其中一个点为基点,编号为0,然后按顺时针方向将其他点依次编号。那么与编号为0相连点的编号一定是奇数,否则,这两个编号间含有奇数个点,势必会有个点被孤立,即在一条线段的两侧分别有一个孤立点,从而导致两线段相交。设选中的基点为A,与它连接的点为B,那么A和B将所有点分成两个部分,一部分位于A、B的左边,另一部分位于A、B的右边。然后分别对这两部分求解即可。所以,

f(n) = f(0)*f(n-2) + f(2)*f(n-4) + f(4)*f(n-6) + ......f(n-4)*f(2) + f(n-2)*f(0)。

(0)*f(n-2)表示编号0的点与编号1的点相连,此时位于它们右边的点的个数为0,而位于它们左边的点为2n-2。依次类推。

f(0) = 1, f(2) = 1, f(4) = 2。结合递归式,不难发现f(2n) 等于h(n)。

(6)求一个凸多边形区域划分成三角形区域的方法数?

设凸边行为ABCDEF...,以凸多边形的一边为基,设这条边的2个顶点为A和B。从剩余顶点中选1个记为X,可以将凸多边形分成三个部分,中间是一个三角形(ABX),左右两边分别是两个凸多边形(B(BX之间的点)X,AX(从X到A的点)),然后求解左右两个凸多边形。

设问题的解f(n),其中n表示顶点数,那么f(n) = f(2)*f(n-1) + f(3)*f(n-2) + ......f(n-2)*f(3) + f(n-1)*f(2)。f(2)*f(n-1)表示三个相邻的顶点构成一个三角形,那么另外两个部分的顶点数分别为2和n-1。

设f(2) = 1,那么f(3) = 1, f(4) = 2, f(5) = 5。结合递推式,不难发现f(n) 等于h(n-2)

(7) 有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?

5元的人来是一个进栈,10元的人来是一个出栈。如果这个问题只考虑进栈和出栈的方式,不考虑具体的人,那么应该有h(n)中安排方式。也可以就考虑这些5元钱,它们总是要都进来一遍,然后又会全出的。

(8)标准二维表问题。设n是一个正整数,2×n的标准二维表是有正整数1,2,...,2n组成的2×n数组,该数组的每行从左到右递增,每列从上到下递增。2×n的标准二维表全体记为Tab(n)。例如当n=3时,Tab(3)二维表如下图所示:

1 2 3  1 2 4  1 2 5  1 3 4  1 3 5

4 5 6    3 5 6  3 4 6  2 5 6  2 4 6

这个问题可以转为为问题(1)。对每个配对的括号从左到右编号,左括号对应的编号放在第一行,右括号对应的编号放在第二行,因为编号从左到右按照顺序,而且右括号的编号肯定比左括号的编号大。比如:()()()对应[1 3 5][2 4 6]这个表,()(())对应[1 3 4][2 5 6]这个表。

因此Tab(n)=h(n).

(9)n个节点的二叉树的不同形态的个数

不同形态的二叉树的数目恰好是前序序列均为1,2,3...n的二叉树所能的到的中序序列的数目。而中序遍历的过程实质上是一个点进栈和出栈的过程。二叉树的形态确定了其节点进栈和出栈的顺序,也确定了其中序序列。因此这个问题就变成问题3.

Catalan数计算及应用的更多相关文章

  1. Catalan数应用整理

    应用一: codevs 3112 二叉树计数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 一个有n个结点的二叉树总共有 ...

  2. catalan数及笔试面试里那些相关的问题(转)

    一.catalan数由来和性质 1)由来 catalan数(卡塔兰数)取自组合数学中一个常在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡塔兰数的一般项 ...

  3. 卡特兰数 Catalan数 ( ACM 数论 组合 )

    卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1)  编辑 收藏 引用 所属分类: ACM ( 数论 ...

  4. 12个高矮不同的人,排成两排(catalan数)

    问题描述: 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? 这个笔试题,很YD,因为把某个递归关系隐藏得很深. 问题分析: 我们先把这12个 ...

  5. UVA 10312 - Expression Bracketing(数论+Catalan数)

    题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1253">10312 - Exp ...

  6. 【集训笔记】【大数模板】特殊的数 【Catalan数】【HDOJ1133【HDOJ1134【HDOJ1130

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3324 http://blog.csdn.net/xymscau/artic ...

  7. catalan 数——卡特兰数(转)

    Catalan数——卡特兰数 今天阿里淘宝笔试中碰到两道组合数学题,感觉非常亲切,但是笔试中失踪推导不出来后来查了下,原来是Catalan数.悲剧啊,现在整理一下 一.Catalan数的定义令h(1) ...

  8. Catalan数——卡特兰数

    一.Catalan数的定义 令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& ...

  9. Ⅳ.Catalan数

    Catalan数首先是由Euler在精确计算对凸n边形的不同的对角三角形剖分的个数问题时得到的,它经常出现在组合计数问题中.     问题的提出:在一个凸n边形中,通过不相交于n边形内部的对角线,把n ...

随机推荐

  1. android 删除SD卡或者手机的缓存图片和目录

    public static final String TEMP_PHOTO_FILE_NAME = "temp_photo.jpg"; private static String ...

  2. jmeter 查看提取的参数

    需求:查看“传入的参数”或者“正则表达提取的参数”等...... 解决:添加Debug Sampler组件,不需要配置,直接使用默认 1.使用CSV Data Set Config组件“传入的参数”直 ...

  3. JAVA视频链接

    Java基础Java马士兵:链接:https://pan.baidu.com/s/1jJRvxGi密码:v3xb Java刘意:链接:https://pan.baidu.com/s/1kVZQCqr密 ...

  4. Fragment详解及举例

    1.为什么用Fragment(Android3.0提出)来替代TabActivity(Android4.0以后正式被弃用)? 因为Fragment可以适应各种不同屏幕大小,也就是适应不同屏幕的分辨率. ...

  5. Spring和MyBatis整合

    前言:在前面一篇文章中,介绍了单独使用MyBatis连接orace的例子,在这里分享学习下Spring和MyBatis是如何整合的,以具体工程为例子 阅读目录: 1.环境准备 2.搭建工程 2.1.a ...

  6. Java开发过程中乱码问题理解

    1.Java编译器(即编译成class文件时) 用的是unicode字符集.2.乱码主要是由于不同的字符集相互转换导致的,理论上各个字符的编码规则是不同的,是不能相互转换的,所以根本解决乱码的方法就是 ...

  7. javascript深入浅出学习笔记

    一.数据类型:1.对象与对象是不相等的,比如:console.log(new Object() == new Object())//结果是false;console.log([1,2] == [1,2 ...

  8. debian下ror新建项目报错解决

    一个是缺少mysql的开发包 sudo apt-get install libmysqld-dev 还有一个报错如下 debian ExecJS::RuntimeUnavailable: Could ...

  9. laravel中session的过期时间

    在项目开发的过程中,前后端分离 需要用session保存用户的登陆信息 这就涉及到session的有效期了 session又分为php中的session有效期和laravel中的session的有效期 ...

  10. php中,如何将编译后的代码,反编译回去。

    编译后 <?php /*********************/ /* */ /* Version : 5.1.0 */ /* Author : RM */ /* Comment : 0712 ...