札记一卡特兰数

参考博文如下列出
https://blog.csdn.net/wookaikaiko/article/details/81105031
https://www.jianshu.com/p/26925a2fc5e7

什么是卡特兰数

卡特兰数满足一下的性质:

h ( 0 ) = 1 , h ( 1 ) = 1 h(0) = 1, h(1) = 1 ,卡特兰数满足递推式:

h ( n ) h ( 0 ) h ( n 1 ) + h ( 1 ) h ( n 2 ) + . . . + h ( n 1 ) h ( 0 )   ( n > = 2 ) h(n)= h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)h(0) (n>=2)

有计算通式 h ( n ) = C 2 n n n + 1 h(n)=\frac{C^{_{2n}^{n}}}{n+1}

栗子

腾讯实习招聘笔试题
在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,
图书馆此时没有了面试宝典了,确保三个人都能借到书,求他们排队的总数?

解题思路:
3个还书的人可以有 3!种顺序.
3个借书的人同样有 3!种顺序.
图书馆没有书,那必须保证还书的数量不少于借书的数量,这样的排序组合数。
我们将还书的人以0标记,借书的人以1标记,那么这样的组合有:
000111 001011 001101 010011 010101
所以最终的答案就是 5 3 ! 3 = 180 5 * 3!*3!= 180

阿里巴巴的笔试题目:
说16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱.16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。

由上面的一题我们知道,答案是 n 8 ! 8 ! n * 8!*8!
其中这个n如何求解呢?
可以抽象为8个0,8个1的从左到右数,确保在当前数的前面,出行的0的次数不少于1的次数的组合数。

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

对于一组数 1,2,3,4,5,…,k.,…,n
假设最后出栈的元素为k
过程一:那么k之前有 k-1个数比k小,对于这k-1个数,在k入栈之前,已经入栈且出栈,栈混洗可能的结果是 f ( k 1 ) f(k-1)
过程二:那么k之后有 n-k个数比k大,对于这n-k个数,在k出栈之前,已经入栈且出栈,栈混洗可能的结果是 f ( n k ) f(n-k)
这两个过程独立,对于此时的k,可能的排列有 f ( k 1 ) f ( n k ) f(k-1)* f(n-k) 种。
又因为 k的取值为1,2,3,…,n。所以有:

f ( n ) = k = 1 n f ( k 1 ) f ( n k ) f(n)=\sum_{k=1}^{n}f(k-1)*f(n-k)

显然,其满足卡特兰数。

二叉树构成问题
有n个结点,问总共能构成几种不同的二叉树

我们可以假设,如果采用中序遍历的话,根结点第k个被访问到,则根结点的左子树有k-1个点、根结点的右指数有n-k个点。k的取值范围为1到n。讲到这里就很明显看得出是卡特兰数了。

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

事实上,向左记为+1,向右记为−1,按照向左优先的原则,从根节点开始遍历.例如第一个图记为+1,+1,+1,−1,−1,−1,于是由卡特兰数的含义可得满二叉树的个数为卡特兰数 C n Cn
在这里插入图片描述

凸多边形的三角形划分
一个凸的n边形,用直线连接他的两个顶点使之分成多个三角形,每条直线不能相交,问一共有多少种划分方案。

这也是非常经典的一道题。我们可以这样来看,选择一个基边,显然这是多边形划分完之后某个三角形的一条边。图中我们假设基边是p1pn,我们就可以用p1、pn和另外一个点假设为pi做一个三角形,并将多边形分成三部分,除了中间的三角形之外,一边是i边形,另一边是n-i+1边形。i的取值范围是2到n-1。所以本题的解即为 c ( n ) = c ( 2 ) c ( n 1 ) + c ( 3 ) c ( n 2 ) + . . . c ( n 1 ) c ( 2 ) c(n)=c(2)*c(n1)+c(3)*c(n-2)+...c(n-1)*c(2) ,满足卡特兰数。
在这里插入图片描述

在n*n的格子中,只在下三角行走,每次横或竖走一格,有多少中走法?

其实向右走相当于进栈,向左走相当于出栈,本质就是n个数出栈次序的问题,所以答案就是卡特兰数。
在这里插入图片描述

引理

n+1个数连乘,不同的乘法顺序数为卡特兰数 C n Cn

考虑:由n对括号形成的合法的表达式的个数
如n=3时,先取4个数1,2,3,4,然后在第一个数下设一个指针,将一个左括号看成是指针右移一格,而将右括号看成是将指针当前指向的数与其左侧的一个数作乘积,并删除左侧的那个数,那么当执行完括号表达式,就得到了一种可能的相乘顺序,如图.
在这里插入图片描述

发布了55 篇原创文章 · 获赞 17 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38204302/article/details/104122296