卡塔兰数非常经典,很多现实问题都是卡塔兰数问题。在编程领域也很常见。如下的面试题:
2012腾讯实习招聘笔试题
在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,确保三个人都能借到书,求他们排队的总数?
解题思路:
3个还书的人,可以有3!种顺序.
3个借书的人同样有3!= 6种顺序.
图书馆没有书,那必须保证还书的数量不少于借书的数量,这样的排序组合数。
我们将还书的人以0标记,借书的人以1标记,那么这样的组合有:
000111 001011 001101 010011 010101,所以最终的答案就是 5 * 3!*3!= 180;
类似的一道阿里巴巴的笔试题目:说16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱。16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。
由上面的一题我们知道,答案是 n * 8!*8!,
其中这个n如何求解呢?可以抽象为
8个0 8个1的从左到右数,确保当前数的前面,出行的0的次数不少于1的次数的组合数。
卡塔兰数:可以这样来理解其定义:n个0与n个1随机组合排列,从左到右数第K个数时,确保K前面0的个数不少于1的个数,这样的组合数就是卡塔兰数。
卡塔兰数的一般公式项卡塔兰数的实例应用案例:
-
括号化问题。一个合法的表达式由()包围,()可以嵌套和连接,如(())()也是合法 表达式;现在有 6 对(),它们可以组成的合法表达式的个数为
-
矩阵连乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(Cn种)
-
出栈次序问题。一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
-
将多边行划分为三角形问题。将一个凸N+2多边形区域分成三角形区域的方法数?类似:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
-
给顶节点组成二叉树的问题。给定N个节点,能构成多少种不同的二叉树,(能构成Cn个)Catalan数的解法Catalan数的组合公式为 Cn=C(2n,n) / (n+1);
例如 4个叶子节点的所有二叉树形态:
4个叶子节点的所有二叉树形态的排列 -
Cn=n*n的方格地图中,从一个角到另外一个角,不跨越对角线的路径数,例如, 4×4方格地图中的路径有:
4×4方格地图中的路径
网友评论