卡特兰数

一、 卡特兰数


1、卡特兰数是满足下列递归式的数字:
       h(n)=h(0)h(n-1)+h(1)h(n-2)+h(2)h(n-3)+…+h(i)h(n-i-1)+…+h(n-1)h(0)(n>=2)
       且,h(0)=1,h(1)=1


2、另一个递归式
      h(n)=((4*n-2)/(n+1))*h(n-1)
      它的解是:h(n)=C(2n,n)/(n+1)(n=1,2,3,…)

       另类解是:h(n)=C(2n,n)-C(2n,n-1)

3h(0)=1, h(1)1h(2)2h(3)5h(4)14h(5)42h(6)132h(7)429h(8)1430h(9)4862h(10)16796h(11)58786h(12)208012h(13)742900h(14)2674440h(15)9694845·····················


二、 卡特兰数的应用


1、 括号化问题

       P=a1*a2*a3*…*an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方法。
解:设P(n)表示n个元素括号化的数目。
       如果a1前的左括号和ai后的右括号相匹配,那么a1…ai括号化的数目为P(i),a(i+1)…an括号化的数目为P(n-i).此时括号化的数目为P(i)*P(n-i)。
       a1…an括号化数目:
       P(n)=P(1)*P(n-1)+P(2)*P(n-2)+…+P(i)*P(n-i)+…+ P(n-1)*P(1)。
      下面来证明P(n)=h(n-1)
1) P(1)=h(0)=1,P(2)=h(1)=1

2) 设P(m)=h(m-1),对于m=1,2,…,n-1成立
    P(n)=∑P(k)*P(n-k) (其中,k=1,2,。。。。,n-1)
    =∑h(k-1)*h(n-k-1)
   设t=k-1
   =∑h(t)*h(n-t-2)(其中,t=0,1,。。。,n-2)
   =h(n-1)

   所以,n个元素括号化的数目是h(n-1)。n个矩阵链的一个括号化,与具有n-1个内节点n个叶节点的分析树相对应。


2、 有n个节点的二叉树共有多少种情形?
      解:有h(n)种情形

自己的理解:
     一共有a0,a1,a2,…,an共n个元素,由它们来构造二叉树。h(n)表示这n个元素一共可以构成h(n)个不同的二叉树。如果选取a0作为根节点,那么其左子树包含0个元素,左子树的数目是h(0);其右子树包含n-1个元素,右子树的数目是h(n-1);以a0为根节点的二叉树的数目是h(0)*h(n-1)。如果选取a1作为根节点,那么其左子树包含1个元素a0,左子树的数目是h(1);其右子树包含h(n-2)个元素,右子树的数目是h(n-2);以a1为根节点的二叉树的数目是h(1)*h(n-2)。如果选取ai作为根节点,其左子树包含i个元素,左子树的数目是h(i);右子树包含n-i-1个元素,右子树数目为h(n-i-1);以ai为根节的二叉树的数目是h(i)*h(n-1-i)。
总的二叉树的数目为h(n)=h(0)*h(n-1)+h(1)*h(n-2)+…+h(i)*h(n-1-i)+…+h(n-1)*h(0)
如果一共有0个节点,那么二叉树的数目为h(0)=1;如果一共有1个节点,那么二叉树的数目为h(1)=1

3、 出栈次序问题
        一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
对于每个数,必须入栈一次,出栈一次。把入栈设为状态1,出栈设为状态0。n个数的所有状态对应于n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1。。。n的顺序入栈,入栈的次数一定大于等于出栈的次数。因此,合法的输出序列是满足下面条件的序列:由左向右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数。
解法1: 证明每个不合法序列与n+1个0和n-1个1组成的序列是一一对应的
       不合法的序列从左向右扫描时,必然存在某一位上首先出现m+1个0和m个1(如果第0位是0,那么第0位就是满足条件的为。如果第0位是1,那么第0位上1的个数比0的个数多1,同时因为序列不合法,必然存在某一位上0的个数比1的个数多;所以,一定存在某一位上出现1的个数比0的个数少1)。此后的2n-2m-1位上有n-m个1和n-m-1个0。如果把后边的2n-2m-1位上的0和1互换,使之成为含有n-m个0和n-m-1个1的序列,结果得由n+1个0和n-1个1组成的序列。
反过来,任何一个由n+1个0和n-1个1组成的序列。因为0的个数比1的个数多2,所以必在某一位上出现0的个数比1的个数多1。同样在后面部分0和1互换,使之成为由n个0和n个1组成的序列,即n+1个0和n-1个1组成的序列对应一个不合法的序列。
因此,不合法的2n个数的序列与由n+1个0和n-1个1组成的序列一一对应。
显然,不合法的方案数位C(2n,n-1),由此得出合法的序列数为C(2n,n)-C(2n,n+1)=C(2n,n)/(n+1)。

解法2:令f(n)表示n个数字可能的出入栈方式, 假设最后出栈的数字是k,那么在k入栈之前,比k小的数字必然已经全部入栈并且全部弹出了,并且有f(k-1)种方式,而在k入栈后,比k大的数字也已经全部入栈并且全部弹出了,有f(n-k)种方式。根据乘法原理,当最后出栈的数字是k时,f(n)=f(k-1)*f(n-k),k=1,2...n。即f(n)=f(1)*f(n-1)+f(2)*f(n-2)+...+f(n-1)*f(1)=h(n)。


4、买票找零问题

    有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

解:h(n)。


5、凸多边形的三角剖分问题
       求将一个凸多边形区域分成三角形区域的方法数。
公式:f(n)=f(3)*f(n-1)+f(4)*f(n-2)+...+f(n-1)*f(3)  ,令
f(2) = 1

            f(3) = 1,f(4)=2,f(5)=5,f(6)=14 …………

          于是: f(n)=h(n-2)


6、上班路径问题

       一位律师在住所以北n个街区和以东n个街区工作。每天她走2n个街区去上班。如果她不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
解:h(n)


7、圆上的点连线问题

   在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
解:h(n)


下面是一些大公司的笔试题

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

C8=1430,所以总数=1430*8!*8!

2012腾讯实习招聘笔试题

在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数?

C3=5;所以总数为5*3!*3!=180.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值