有趣的数学--Catalan Number
2015-10-29 21:57
274 查看
Introduction
上午在给本科生上习题课时遇到这样一个问题:n个元素进栈有多少个出栈顺序? 在计算机中,栈操作要遵循先进后出和后进先出的规则,就像压弹匣一样。 设有n个元素,其出栈顺序为f(n),则: f(1)=1; f(2)=2; //12,21 f(3)=5; //123,132,321,213,231 (312--该顺序不存在) f(4)=14; ... 下面以f(4)为例,我们推导一个更一般的计算公式。记4个元素为a、b、c、d,出栈后位置为1、2、3、4。 ① 假如a出现在1号位置,那么只能a先进栈然后再立即出栈,其他3个元素的出栈顺序为子问题f(3); ② 假如a出现在2号位置,那么一定有一个元素出现在1号位置,共有f(1)种可能(只能为b)。3、4号位置元素的出栈可能为子问题f(2)。故a在2号位置的所有可能为f(1)*f(2); ③ 假如a出现在3号位置,那么1、2号位置元素的出栈可能为f(2)。4号位置的元素出栈可能为f(1)。故a在3号位置的所有可能为f(2)*f(1); ④ 假如a出现在4号位置,那么只能等其他3个元素进栈出栈结束后,a再进行进栈出栈操作。故a出现在4号位置时的所有可能为f(3)。 所以,当有4个元素时,所有可能的出栈顺序数为: f(4)=f(3)+f(1)*f(2)+f(2)*f(1)+f(3). (1) 为了规范,我们记f(0)=1,那么公式(1)变为: f(4)=f(0)f(3)+f(1)*f(2)+f(2)*f(1)+f(3)f(0). (2) 当元素个数为n时, f(n)=f(0)*f(n-1)+f(1)*f(n-2)+…+f(n-1)*f(0) (3)
在编程实现时,该递推公式需要维护一个一维数组,将f(0)到f(n-1)共n个数据存入数组中,这样的话复杂度就比较高,如何把该递推公式转换为一个通项公式呢?这就进入本文的主题了--Catalan Number。 该问题的最终解就是C(2n,n)/(n+1),其中C(2n,n)表示从2n个数中选出n个数的组合数。也有人从几何上推导出该问题的答案为C(2n,n)-C(2n,n-1),其实该式化简后可以得到同样的解。 比如以3142为例,该序列不可能发生,因为‘3’后面比它小的有‘1’,‘2’。但是‘12’是顺序排列的而不是逆序排列的,所以根据条件该序列是不可能发生的。这也很容易理解,‘12’本来排在‘3’之前,现在‘3’已经出栈,说明‘1’‘2’仍在栈中,而在栈中的位置一定是‘1’在‘2’下面,所以出栈后一定是‘2’在‘1’前。
Catalan Number
概念
Catalan数是组合数学中一个常在各种计数问题中出现的数列。一般项公式为:
Cn的另一个表达形式为:
当n=0,1,2,3,4,5,6,7,8,9,10,11, ... 时 Cn = 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, ...
应用
组合数学中有非常多的组合结构可以用卡塔兰数来计数。在Richard P. Stanley的Enumerative Combinatorics: Volume 2一书的习题中包括了66个相异的可由卡塔兰数表达的组合结构。以下用Cn=3和Cn=4举若干例。
1.括号化问题
一个有n个X和n个Y组成的字串,且所有的部分字串皆满足X的个数大于等于Y的个数。以下为长度为6的dyck words: XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY 将上例的X换成左括号,Y换成右括号,Cn表示所有包含n组括号的合法运算式的个数: ((())) ()(()) ()()() (())() (()())
2.出栈次序问题。
一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
3.二叉树问题
有N个节点的二叉树共有多少种情形? n个节点的二叉树的所有可能形态数为Cn。 类似题目: n个非叶节点的满二叉树的形态数(对称后得到的二叉树除非自己本身对称,否则算是不同)。 这里要求满二叉树,实际上就是在上一点的每个子节点的空儿子上都加上叶子,就形成了我们的图了,那么我们要求的结果就是Catalan数。
4.将多边行划分为三角形问题。
凸n+2边形进行三角形分割(只连接顶点对形成n个三角形)数:
5. n×n格点中不越过对角线的单调路径的个数
Cn表示所有在n × n格点中不越过对角线的单调路径的个数。一个单调路径从格点左下角出发,在格点右上角结束,每一步均为向上或向右。计算这种路径的个数等价于计算Dyck word的个数: X代表“向右”,Y代表“向上”。下图为n = 4的情况:
6.阶梯切割问题
n层的阶梯切割为n个矩形的切法数也是Cn。如下图所示:
7.填数问题
在一个2*n的格子中填入1到2n这些数值使得每个格子内的数值都比其右边和上边的所有数值都小的情况数也是Cn。
8.电影院买票问题:
有2n个人排队进电影院,票价是50美分。在这2n个人当中,其中n个人只有50美分,另外n个人有1美元(纸票子)。愚蠢的电影院开始卖票时1分钱也没有。问:有多少种排队方法使得每当一个拥有1美元买票时,电影院都有50美分找钱。(注:1美元=100美分拥有1美元的人,拥有的是纸币,没法破成2个50美分。) 解答:很显然结果是卡塔兰数,这个和小括号问题很像。
笔试题
(1)12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? (2)阿里巴巴笔试题:16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱。16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。 C8=1430,总数=1430*8!*8!。 (3)腾讯笔试题:在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数。 C3=5,总数=5*3!*3!。
Reference
[1].https://en.wikipedia.org/wiki/Catalan_number[2]./article/8684741.html
[3].http://blog.chinaunix.net/uid-29760713-id-4367722.html
相关文章推荐
- Activity的生命周期
- Css Hack 大全(IE6、IE7、IE8、IE9 css hack)
- C++ main函数 argc,argv传递参数的含义
- stderr和stdout详细解说
- 一台主机利用apache服务器开启虚拟主机后无法使用www域名解决方法
- Linux中环境变量文件及配置
- HDU 2088 &&TOJ 1601. Box of Bricks【水题】好思路
- uva 213 Message Decoding 字符串处理
- OC第四天之 NSString
- ServletConfig实现简单的登录操作
- 《代码阅读方法与实践之读书笔记之三》
- C 常用基本类型的原型——time_t, size_t 等
- POJ 2406 Power Strings (kmp求周期)
- MVC框架
- ASP.NET导出文件FileResult的使用
- AndroidTest
- 原SLICK3.0 MySQL InnoDB Driver
- 第九周项目2—对称矩阵压缩存储的实现与应用
- 虚幻4 Event、CustomEvent、EventDispatcher
- Python2.X和Python3.X的w7同时安装使用