参考:http://lanqi.org/skills/10939/

卡特兰(Catalan)数来源于卡特兰解决凸n+2边形的剖分时得到的数列Cn,在数学竞赛、信息学竞赛、组合数学、计算机编程等方面都会有其不同侧面的介绍.卡特兰问题的解决过程应用了大量的映射方法,堪称计数的映射方法的典范。为了便于读者理解,我们先介绍一些卡特兰问题的简单变形,再介绍卡特兰问题及其解法。

问题一 进出栈

栈是一种先进后出(FILO,First In Last Out)的数据结构。
如图1,2,3,4顺序进栈,那么一种可能的进出栈顺序是:

1In→2In→2Out→3In→4In→4Out→3Out→1Out,

于是出栈序列为1,3,4,2。

那么一个足够大的栈的进栈序列为1,2,3,⋯,n时有多少个不同的出栈序列?

解 : 首先,每一种进出栈的顺序都与出栈序列一一对应.也就是说,如果我们用+1表示进栈,−1表示出栈,那么题中示例中的出栈序列1,3,4,2与进出栈顺序

+1,+1,−1,+1,+1,−1,−1,−1,

是对应的。

那么对n个数的序列,总的进出栈顺序是给2n个1前面挑n个添加+号,其他的添加−号,共C(2n,n)种吗?

答案是否定的,这是因为出栈的前提是有进栈动作,于是要求每个排列中的前若干项和均不为负数,也就是说排列

1,−1,−1,1,1,−1,−1,1

是无效的。

那么无效的排列到底有多少呢?

考虑M是所有无效的排列构成的集合,考虑其中第一次发现排列无效的时候,也就是第一次发现其前若干项和为−1的时候,此时我们将包含使得前若干项和为−1的这一项开始的之前的所有项全都取相反数,那么就会得到一个新的排列,这个排列包含n+1个+1,以及n−1个−1,设所有这样的排列构成集合N。

显然,这个M→N的映射是一一映射(N中的每一个排列从第一项往后累积求和的时候必然会出现和为+1的情形,此时将排列中使得和为+1的这一项连同之前的所有项全部取相反数,那么就会得到M中的一个排列)

因此无效的排列共有C(2n,n−1)个。

综上,所有不同的出栈序列总数为C(2n,n)−C(2n,n−1),即C(2n,n)/(n+1)

进出栈问题的一个简单变形就是二叉树问题:

求n+1个叶子的满二叉树的个数

事实上,向左记为+1,向右记为−1,按照向左优先的原则,从根节点开始遍历。记为

+1,+1,+1,−1,−1,−1,

于是由卡特兰数的含义可得满二叉树的个数为Cn。

问题二 电影购票

电影票每张50元,如果有m+n个人排队买票,其中m个人各持有50元面值的钞票1张,另外n个人各持有100元面值的钞票1张,而票房没有预备找零。有多少种方法可以将这m+n个人排成一列,顺序购票,使得无需因为等待找零而耽误时间?

解: 我们给进出栈问题一个几何模型:

只要将向右记为+1,向上记为−1,就转化成了问题一。

利用这个模型,我们解决这个卡特兰问题的变形问题,并顺便给进出栈问题的解法一个几何解释。

在一个m×n的网格中,从左下角的原点O(0,0)出发,每次向右(表示接待的观众持有50元的钞票)或向上(表示接待的观众持有100元的钞票)移动,最终到达P(m,n).我们需要找到在直线y=x下方(包括边界)的路径条数。

从反面考虑问题。设M为穿过直线y=x(表示会经过直线上方的点)的从O→P的路径组成的集合

利用对称可以将M中第一次犯规时的路径对称,然后再将剩下的部分接在对称后的路径上,由于此时将一次向上移动修改为了向右移动,因此终点由P变成了P′,此时就建立了与O到P′的路径的一个一一映射。

因此

card(M)=card(N)=C(m+n,n−1)

于是所求的排列数为

C(m+n,n)−C(m+n,n−1).

特别的,当m=n时有

C(m+n,n)−C(m+n,n−1)=C(2n,n)−C(2n,n−1)=C(2n,n)/(n+1),

即卡特兰数。

问题三 圆内连弦

圆周上有2n个点,以这些点为端点连互不相交的n条弦,求不同的连法总数。

解: 为了解决这个问题,我们重新解释卡特兰数的推导方式。先解决下面的辅助问题:

圆周上有2n+1个点,其中n+1个点上标“+1”,n个点上标“−1”,如果可以找到某个标有“+1”的点作为起点,当顺时针沿圆周前进时将所遇到的点(包括起点)上标的数相加得到的和始终为正数,就称这种标记法是好标记法。求好标记法的总数(注意考虑圆排列)。

辅助问题的解: 对于任何一种标记法,我们将顺时针相邻的“+1”“−1”(指顺时针前进时先遇到“+1”后遇到“−1”)同时抹去,可以证明抹去的前后对标记法的好坏没有影响。不停的重复这一过程,则最后只剩一个标有“+1”的点,显然此时标记法为好的。因此所有的标记法都是好标记法,显然其数目为

C(2n+1,n)/(2n+1)=C(2n,n)/(n+1).

问题的解: 通过对辅助问题的进一步探索可知,每一种将圆周上2n+1个点标记为n+1个+1点,和n个−1点的方法唯一确定一个顺时针前进的方案(即起点)。我们将这个起点删去,剩下的2n个点在顺时针方向上一定为“+1”“−1”“+1”“−1”,…,此时将顺时针相邻的这些“+1”“−1”点用弦连接起来,就得到互不相交的n条弦.这样我们就建立了从好标记法到弦的连法的单射。

反过来,如果我们有了一种弦的连法,就可以从某条弦的端点出发顺时针前进,对每条弦的两个端点都是先遇到的端点标上“+1”,后遇到的端点标上“−1”,然后在最后回到出发点时添上一个标有“+1”的点。这样我们就建立了从弦的连法到好标记法的单射。

综上,所求的不同连法数为C(2n,n)/(n+1)。

问题四 凸多边形的剖分(卡特兰问题)

求凸n+2边形用其n−1条对角线分割为互不重叠的三角形的分法总数。

解: 先介绍两个关于卡特兰数Cn的小引理,将问题一中的+1和−1分别看成左括号和右括号,我们得到

引理一 由n对括号形成的合法括号表达式的个数为Cn。

比如n=3时,所有合法的括号表达式有

((())),(())(),()(()),()()(),(()()),

共5个。

考虑n+1个数相乘,不同的相乘顺序的数目。我们可以给出每一个合法的括号表达式和一种可能的相乘顺序的对应方式。如n=3时,先取4个数a,b,c,d,然后在第一个数下设一个指针,将一个左括号看成是指针右移一格,而将右括号看成是将指针当前指向的数与其左侧的一个数作乘积,并删除左侧的那个数,那么当执行完括号表达式,就得到了一种可能的相乘顺序

这样我们就从引理一出发得到了

引理二 n+1个数连乘,不同的乘法顺序数为Cn。

注 这样也是RPN模式的计算机的工作模式,可以无需括号完成计算,从而节省按键的次数。这种计算器在财务计算中大量使用,如图。

接下来解决卡特兰问题,用1,2,3,⋯,n+2标记凸n+2边形的边,从标记为1的边的起点(按逆时针方向)开始按未标记的对角线均为向外标记方向。

进而,逆时针读图,将出的箭头读为左括号,进的箭头读为右括号,就得到了剖分方式与连乘顺序的对应。图10中的两个图对应的连乘顺序表达式分别为

1((2(34))5)6,(1(23))(45)6,

抛开6不计,每个连乘顺序表达式实际上就是规定了n+1个数连乘时,不同的乘法顺序,根据引理一,得到剖分方式的总数为Cn。

卡特兰数的性质

卡特兰数有一些优美的性质,如

由卡特兰问题以及其各种变形很容易推导卡特兰数的递推公式。相应的,我们也可以利用递推公式二来发现和证明某些卡特兰问题的变形,比如:

探索用n个长方形去填充一个高度为n的阶梯图形的方法数

解: 把包含左上角的矩形去掉,就很容易由递推公式二推得所有填充方法数就是卡特兰数Cn了。

卡特兰(Catalan)数相关推荐

  1. 卡特兰(Catalan)数入门详解

    文章目录 基本概念 介绍 定义 实际问题 例题1 方法 01序列 括号匹配 进出栈问题 312排列 不相交弦问题 二叉树的构成问题 凸多边形的三角划分 阶梯的矩形划分 也许更好的阅读体验 基本概念 介 ...

  2. Catalan数——卡特兰数

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

  3. C++打印0到N的Catalan数卡特兰数(附完整源码)

    打印0到N的Catalan数卡特兰数 打印0到N的Catalan数卡特兰数算法的完整源码(定义,实现,main函数测试) 打印0到N的Catalan数卡特兰数算法的完整源码(定义,实现,main函数测 ...

  4. Catalan数(卡特兰数)系列问题及代码

    目录 Catalan数(卡特兰数) 姐妹洗碗问题 n个不同元素进栈,求出栈元素不同排列的个数? 找零问题 一般化 c++代码实现 Catalan数(卡特兰数) 姐妹洗碗问题 n个不同元素进栈,求出栈元 ...

  5. 卡特兰数 Catalan数

    From: http://www.cppblog.com/MiYu/archive/2010/08/07/122573.html 维基百科资料: 卡塔兰数 卡塔兰数是组合数学中一个常出现在各种计数问题 ...

  6. 卡特兰数 java,Catalan数(卡特兰数)

    由于Catalan数经常会在算法题或面试题中出现,在这里做一下小小的总结. 介绍 Catalan数是组合数学中一个常在各种计数问题中出现的数列.一般项公式为 Cn的另一个表达形式为 一般来讲,我们编程 ...

  7. 面试收集--卡特兰数(Catalan数)应用

    引言:有高矮不同的12个人,现在要他们对应排成两列,保证两列分别有序,且对应位置总是第一列比第二列矮,请问有多少种排列方式? 这是蘑菇街笔试的时候一个题目,当时陷入了枚举分类的死循环中,殊不知如果知道 ...

  8. [Catalan数三连]网格有趣的数列树屋阶梯

    如何让孩子爱上打表 Catalan数 Catalan数是组合数学中一个常出现在各种计数问题中的数列. 以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名. 先丢个公式(设第n项为$ ...

  9. Catalan数推导及应用

    Catalan数的定义: 设表示用下面的方法把凸多边形区域分成三角形区域的方法数:在有n+1条边的凸多边形区域内通过插入在其中不相交的对角线而把它分成三角形区域.定义.则满足递推关系     这个递推 ...

  10. Catalan数应用

    Catalan数应用 Catalan数应用 原理 卡特兰数经典应用 括号化 买票找零 组合数与阶乘计算 卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中的数列.由以比利时的数学家欧仁·查理 ...

最新文章

  1. 四大运营商的5G部署路线一览
  2. python进行ocr识别图片上的中文
  3. 手机 滑动_真的滑动屏,华为手机柔性屏新的专利布局
  4. 48幅非常搞笑的平面广告作品欣赏(上篇)
  5. 五大板块(4)——链表
  6. C语言可变参数函数的使用及相关函数介绍
  7. leetcode:Single Number【Python版】
  8. jQuery 中 data 方法的实现原理
  9. el-table固定列之后没有出现滚动条_一道经典的MySQL面试题,答案出现三次反转...
  10. Poj(1182),种类并查集
  11. book118免费下载文档方法
  12. 微服务架构学习与思考(04):微服务技术体系
  13. python绘制中国省界地图_利用python绘制中国地图(含省界、河流等)
  14. 玩转Excel快捷键和常用函数和图表,赶紧学起来
  15. godaddy服务器内网站转移,2021年Godaddy最新域名转出教程 | Godaddy美国主机中文指南...
  16. java程序员表白代码_程序员表白代码,用过的人都找到了对象...
  17. Git 推送命令报错
  18. 删除电脑被占用的串口
  19. Simulink:车辆换挡逻辑回顾_Demo
  20. KISSY基础篇乄KISSY之IO(2)

热门文章

  1. Linux 关机和重启
  2. 计算机信息系统集成一级和二级资质认证通过企业名单
  3. ThinkPHP中vendor()方法导入第三方类库的用法!ThinkPHP 3.2 vendor()方法的深入研究!
  4. Java——上溯造型下溯造型
  5. js(EcamaScript)
  6. 你会正确卸载数据库吗?
  7. uni-app H5 上传图片
  8. wms地图绘制工具_地图空间分析工具MapViewer下载-地图空间分析(MapViewer)下载v8.4.406 官方版-西西软件下载...
  9. 弘辽科技:淘宝平台的推广方法有哪些?六大推广方式介绍
  10. Hive常用库表操作及知识汇总