面试收集--卡特兰数(Catalan数)应用
引言:有高矮不同的12个人,现在要他们对应排成两列,保证两列分别有序,且对应位置总是第一列比第二列矮,请问有多少种排列方式?
这是蘑菇街笔试的时候一个题目,当时陷入了枚举分类的死循环中,殊不知如果知道Catalan数的概念,直接就计算出来了。catalan组合数学上的递归式定义如下,这个递归定义是欧拉在研究下面问题5时得出的一个式子,是Catalan数起源的一种说法。
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0)=C(2n,n)-C(2n,n+1)=C(2n,n)/(n+1)
注:在参考四中另有一种定义h(n)=h(1)*h(n-1)+h(2)*h(n-2)+…h(n-1)*h(1)=C(2n-2,n-1)-C(2n-2,n)=C(2n-2,n-1)/n,这只是个如何确定n的问题,对分析题意影响不大,下面的分析基于第一种定义。
由上面的定义可知,有两种情况是Catalan数来算,一种是用组合的形式给出结论的,即最后能算出C(2n,n)-C(2n,n+1),如下面列举的例子1,2,3,8,其实其它几个例子也能转化成这种形式,但是不直观,其它几个例子直观上会有h(1)*h(n-1)+h(2)*h(n-2)+…h(n-1)*h(1)的形式。
附录参考2中有一个对某些例子而言很清晰的解释。
Catalan数有在很多场景会见到,常见的有:
1. 直角等边三角形网络(直角边长为n)的路径问题(见参考1)—h(n-1)
思路:在2(n-1)个位置中找出哪(n-1)步朝上(C(2n-2,n-1)),并删除超过对角线的情况C(2n-2,n),即h(n-1)=C(2n-2,n-1)-C(2n-2,n)
2.出栈入栈问题(见参考1),栈无穷大,n个数?—h(n)
思路:选定n个位置入栈,n个位置出栈,C(2n,n),去除出栈入栈顺序不对的C(2n,n+1),因此为h(n)=C(2n,n)-C(2n,n+1)
3.2n个人买票找零问题(售票处无零钱,观影者一半手持5块,一半手持10块,票价5块)—h(n)
思路同2.
4.n矩阵相乘的括号问题h(n-1)
思路: 分析有如下形式
这是catalan数的形式,f(1)=1,f(2)=1,故f(n)=h(n-1)
5.凸n边形分割成多少个三角形(见参考4)—h(n-1)
思路,具体思路见参考4,分析同4.
6.n个可以构造出多少种不同的二叉树—h(n)
思路,选定一个数作为根节点,因此有:
,
这也是catalan数的特征,f(0)=1,f(1)=1,f(2)=2,因此有f(n)=h(n)
7.在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?--h(n-1)
思路:如图,由于不相交,分割的时候若A1和A2k有连线,那么左侧有2(k-1)个点,右侧有2(n-k),所以:
f(2)=1,f(4)=1,故f(2n)=h(n-1)
8.有高矮不同的12个人,现在要他们对应排成两列,保证两列分别有序,且对应位置总是第一列比第二列矮,请问有多少种排列方式?
此题在参考1中描述得非常准确
参考1:http://blog.csdn.net/suyksuyk/article/details/4697941
参考2:http://blog.sina.com.cn/s/blog_66f4dd01010129a7.html
参考3:http://blog.csdn.net/wuzhekai1985/article/details/6764858?reload
参考4:http://blog.csdn.net/muye5/article/details/7984061