卡特兰数(Catalan Number)

转载 2018年04月15日 20:26:57

原文地址:点击打开链接



Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。

卡特兰数的前几个数
前20项为(OEIS中的数列A000108):1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190

在这里我只详细证明一个例子:
(和我后面要写的一个HD题目有关).(HD1133题)
即排队买票问题(出栈次序问题):
一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
  有2n个人排成一行进入公园。入场费1元。其中只有n个人有一张1元钞票,另外n人只有2元钞票,剧院无其它钞票,问有多少中方法使得只要有2元的人买票,售票处就有1元的钞票找零?(将持1元者到达视作将1元入栈,持2元者到达视作使栈中某1元出栈)

不难看出,该题求的是左端点为首元素的任意区间内,1的个数大于等于2的个数。

方法一:折现法
可以认为问题是,任意两种操作,持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次。即操作1为n-1,操作2为n+1。总数为C(2n,n-1)。

这个证明的关键就是最终一定会到达(2n,0)这个点。

对于不满足情况的方案,它一定会越过y=-1,它一定会越过y=-1,捉住这个特点,我们可将求不合法的方案数这个问题换个说法来:从(0,0)到(2n,-2)一共有多少种走法?这个走法数就是C(2n,n-1)因为走右下角的要多走2步,同时一共只走2n步,那就右下角走n+1步,方案法就是2n选n-1.它一定会越过y=-1

合法数=C(2n,n)-C(2n,n-1);

ps.个人理解:

每出现一个非法情况,那么它肯定会碰到y=-1,所以我们就想要一种排列表示所有非法的情况,即每一次必定会碰到y=-1且1,0的总个数还是2n.那么我们将终点设成(2n,-1)这样肯定不行,s0+s1=2n,abs(s0-s1)=1解出来s0,s1是分数,那么我们就再向下一格(这样也能保证这个序列必过y=-1),那么我们再解上述方程就知道,s0=n-1,s1=n+1||s0=n+1,s1=n-1.第一种情况肯定不行,因为按那个排列,可能不会出现到y=-1的情况,第二种情况,就一定能保证到达y=-1的情况(必定存在某一个奇数位,0累计个数大于1的累计个数),且还对应每一个原序列的非法情况,只要将原序列第一次出现的非法的位置后的各位0变成1,1变成0,就对应现在序列的一种情况了

方法二:

还可以等价为求从A点到B点不超过(可接触)红色对角线的最短路径的数量。

如图,易知所有超过红色红色对角先的路径都会碰到绿线。
对A做关于绿线的对称点A’。则A’到B点的路径总数即为非法路径总数。

合法路径数=总路径数-非法路径数=C(2n,n)-C(2n,n-1)。

每個人都是不一樣的,所以需要全排列* n!*n!

可以推广到一般形式,1元的m人,2元的n人。
( C(m+n,n) - C(m+n,m+1) ) * m! * n!=
( C(m+n,n) - C(m+n,n-1) ) * m! * n!

百度百科:

出栈次序
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?[5-6] 
常规分析
首先,我们设f(n)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则,由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有f(k-1)种,而之后比k大的值入栈,且都在k之前出栈,因此有f(n-k)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,f(n-k)*f(k-1)种,求和便是Catalan递归式。ps.author.陶百百)
首次出空之前第一个出栈的序数k将1~n的序列分成两个序列,其中一个是1~k-1,序列个数为k-1,另外一个是k+1~n,序列个数是n-k。
此时,我们若把k视为确定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的f(n)=f(k-1)×f(n-k)。而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)。
看到此处,再看看卡特兰数的递推式,答案不言而喻,即为f(n)=h(n)= C(2n,n)/(n+1)= c(2n,n)-c(2n,n-1)(n=0,1,2,……)。
最后,令f(0)=1,f(1)=1。
非常规分析
对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。
在2n位二进制数中填入n个1的方案数为c(2n,n),不填1的其余n位自动填0。从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。
不符合要求的数的特征是由左而右扫描时,必然在某一奇数位2m+1位上首先出现m+1个0的累计数和m个1的累计数,此后的2(n-m)-1位上有n-m个 1和n-m-1个0。如若把后面这2(n-m)-1位上的0和1互换,使之成为n-m个0和n-m-1个1,结果得1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n+1个0和n-1个1组成的排列。
反过来,任何一个由n+1个0和n-1个1组成的2n位二进制数,由于0的个数多2个,2n为偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位数,即n+1个0和n-1个1组成的2n位数必对应一个不符合要求的数。
因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应。
显然,不符合要求的方案数为c(2n,n+1)。由此得出输出序列的总数目=c(2n,n)-c(2n,n-1)=c(2n,n)/(n+1)=h(n)。
类似问题 买票找零
有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)


卡特兰数(Catalan Number) 算法、数论 组合~

Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。卡特兰数的前几个数 前20项为(...
  • qq_26525215
  • qq_26525215
  • 2016-05-21 17:49:18
  • 9182

Catalan(卡特兰)数及定理的简要证明------附上简要代码

Catalan数很重要, 学计算机的, 没有不知道这个的, 我这个非计算机专业的学生, 也来凑凑热闹:           卡特兰数和上述定理的应用非常普遍, 也是很多IT公司笔试...
  • stpeace
  • stpeace
  • 2015-05-23 23:12:28
  • 5370

Catalan数公式推导

 如何把下列递归公式 { f(0)=f(1)=1 } f(n)=f(0)*f(n-1-0)+f(1)*(n-1-1)+f(2)*f(n-1-2)+....+f(n-1-0)*f(0) 转化为 f(n...
  • touzani
  • touzani
  • 2007-05-15 22:27:00
  • 5267

Catalan数推导及应用

一、Catalan数的定义:       令h(1)=1,Catalan数满足递归式:h(n) = h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1),n>=2该...
  • ACdreamers
  • ACdreamers
  • 2012-06-03 20:31:58
  • 4438

程序员数学--卡特兰数(Catalan number)

10个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问有多少种排列方式? 我们可以先把这10个人从低到高排列,然后,选择5个人排在第一排,那么剩下的5个人肯定是在第...
  • u011080472
  • u011080472
  • 2016-04-15 16:35:39
  • 2589

卡特兰数(Catalan)及应用

卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。...
  • u010385646
  • u010385646
  • 2014-05-23 21:16:54
  • 2985

卡特兰数 Catalan数 ( ACM 数论 组合 )

卡塔兰数 卡塔兰数是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。 卡塔兰数的一般项公式为                    ...
  • hangelsing
  • hangelsing
  • 2015-08-20 14:47:45
  • 2280

卡特兰数 Catalan number

简介编辑 卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 ...
  • jerryzcx
  • jerryzcx
  • 2014-02-23 20:08:51
  • 546

卡特兰数(Catalan)及其应用

卡特兰数 卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列。 卡特兰数前几项为 : C0=1,C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,C7=429,C8=143...
  • doc_sgl
  • doc_sgl
  • 2013-05-03 16:54:52
  • 4676

卡特兰数(catalan数)总结 (卡特兰大数、卡特兰大数取模、卡特兰数应用)

本文讲解卡特兰数的各种递推公式,以及卡特兰数、卡特兰大数、卡特兰大数取模的代码实现,最后再顺带提一下卡特兰数的几个应用。...
  • zuzhiang
  • zuzhiang
  • 2017-09-13 15:28:31
  • 248
收藏助手
不良信息举报
您举报文章:卡特兰数(Catalan Number)
举报原因:
原因补充:

(最多只允许输入30个字)