卡特兰数总结

最近在做腾讯笔试题的时候,碰到一个排列问题:

找工作的季节马上就到了,很多同学去图书馆借阅《面试宝典》这本书,现在图书馆外有6名同学排队,其中3名同学要将手中的《面试宝典》还至图 书馆,有3名同学希望从图书馆中可以借到《面试宝典》,若当前图书馆内已无库存《面试宝典》,要保证借书的3名同学可以借到书,请问这6位同学有多少种排 队方式()

A)60

B)120

C)180

D)360

答案是C。自己做的时候是分情况讨论的,虽然答案是对的,但是很麻烦。然后在网上看到别人说是卡特兰数题型,解法如下:

C(n,2n)/(n+1),n是入栈元素的个数,这里n=3,C(3,6)/4=5,同学彼此是不同的,因此要全排列一下,结果为5*3!*3!=180。


我之前从没听过卡特兰数,特意学习了一下,先做一下总结。

卡特兰数,一种有着特殊规律的数列

令h(0)=1,h(1)=1,catalan数满足递推式[1] 

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

例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2

h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5

另类递推式[2] 

h(n)=h(n-1)*(4*n-2)/(n+1);

递推关系的解为:

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

递推关系的另类解为:

h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)


卡特兰数的证明方法:折线法

    事实上,可以认为问题是,任意两种操作,要求每种操作的总次数一样,且进行第k次操作2前必须先进行至少k次操作1。我们假设一个人在原点,操作1是此人 沿右上角45°走一个单位(一个单位设为根号2,这样他第一次进行操作1就刚好走到(1,1)点),操作2是此人沿右下角45°走一个单位。第k次操作2 前必须先进行至少k次操作1,就是说明所走出来的折线不能跨越x轴走到y=-1这条线上!在进行n次操作1和n此操作2后,此人必将到到达(2n,0)! 若无跨越x轴的限制,折线的种数将为C(2n,n),即在2n次操作中选出n次作为操作1的方法数。

现在只要减去跨越了x轴的情况数。对于任意跨越x轴的情况,必有将与y=-1相交。找出第一个与y=-1相交的点k,将k点以右的折线根据y=-1对称(即操作1与操作2互换了)。可以发现终点最终都会从(2n,0)对称到(2n,-2)。由于对称总是能进行的,且是可逆的。我们可以得出所有跨越了x轴 的折线总数是与从(0,0)到(2n,-2)的折线总数。而后者的操作2比操作1要多0-(-2)=2次(因为前者终点是(2n,0),后者终点是(2n,-2))。即操作1为n-1,操作2为n+1。总数为 C(2n,n-1),即在2n次操作中选出n-1次作为操作1的方法数。



卡特兰数的应用例子:

1.将多边行划分为三角形问题。将一个凸多边形区域分成三角形区域(划分线不交叉)的方法数?

2、出栈次序问题。一个栈(无穷大)的进栈序列为1、2、3、...、n,有多少个不同的出栈序列?
类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

3、给顶节点组成二叉树的问题。
  给定N个节点,能构成多少种形状不同的二叉树?
  (一定是二叉树!先取一个点作为顶点,然后左边依次可以取0至N-1个相对应的,右边是N-1到0个,两两配对相乘,就是h(0)*h(n-1) + h(2)*h(n-2) +...... + h(n-1)h(0)=h(n))   (能构成h(N)个)





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
卡特兰数是一种组合数学中的数列,常用于计数一些具有特定结构的对象。其中,n个节点的二叉树个数也可以用卡特兰数进行计算。 首先,我们定义一个二叉树BST(n),其中n表示二叉树中节点的个数。我们可以发现,对于BST(0)来说,它是一棵空树,也是唯一的一种情况。对于BST(1),只有一个根节点,也是唯一的一种情况。对于BST(2),我们可以将根节点视为i,左子树中节点个数为i-1,右子树中节点个数为n-i,其中1<=i<=n。这样,我们可以通过递归的方式,将BST(n)的计算问题划分为求解BST(i-1)和BST(n-i)的计算问题,然后将二者的计算结果相乘,再将所有i从1到n的计算结果累加,即可得到BST(n)的结果。 这个过程可以表示为如下的递推公式: BST(0) = 1 BST(1) = 1 BST(n) = BST(0)*BST(n-1) + BST(1)*BST(n-2) + ... + BST(n-1)*BST(0),其中n>=2 通过计算我们可以发现,n个节点的二叉树个数恰好对应了卡特兰数C(n)的结果。因此,n个节点的二叉树个数是卡特兰数。这是因为卡特兰数的定义与BST(n)的递归公式相吻合,并且满足初始条件。卡特兰数是一种具有递归性质的数列,它在计算组合问题中经常出现。 总结起来,n个节点的二叉树个数是卡特兰数,是通过递推公式BST(n) = BST(0)*BST(n-1) + BST(1)*BST(n-2) + ... + BST(n-1)*BST(0)以及初始条件得到的。卡特兰数的计算结果能够准确表示n个节点二叉树的个数,这与二叉树的特定结构有关。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值