zoukankan      html  css  js  c++  java
  • 卡特兰数

    资料参考:

    卡特兰数(Catalan)

    卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰(1814–1894)命名。历史上,清代数学家明安图(1692年-1763年)在其《割圜密率捷法》最早用到“卡塔兰数”,远远早于卡塔兰[1][2][3]。有中国学者建议将此数命名为“明安图数”或“明安图-卡塔兰数”。
    卡塔兰数的一般项公式为       可展开为 h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2,h(0) = h(1) = 1) 

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

    卡特兰数的性质

    Cn的另一个表达形式为

    递推关系

    它也满足

    这提供了一个更快速的方法来计算卡塔兰数。

    卡塔兰数的渐近增长为它的含义是当n → ∞时,左式除以右式的商趋向于1。(这可以用n!的斯特灵公式来证明。)所有的奇卡塔兰数Cn都满足。所有其他的卡塔兰数都是偶数。

    卡特兰数的证明

     折现法证明

    有以下任意两种操作,要求每种操作的总次数一样,且进行第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)。

    卡特兰数的应用

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

    证明一:

    设f(n)为n个数时的方案数。已知f( 0 ) = 1,f( 1 ) = 1.
    若当n = 4时:
    F1     F2     F3     F4
    1  2  3  4                  //四种状态分别标记为F1,F2,F3,F4
    若 F1 位于一号位置,则 F1 之前的位置的数字出栈顺序的情况数为f( 0 ),在一号位置后的数字出栈顺序的情况数为f(3);则 F1 位于一号位置时方案总数为f(0)*f(3);
    若 F1 位于二号位置,则 F1 之前的位置的数字出栈顺序的情况数为f( 1 ),在二号位置后的数字出栈顺序的情况数为f(2);则 F2 位于二号位置时方案总数为f(1)*f(2);
    同理:F1位于三号位置时 方案数为 f(2)*f(1);F1位于四号位置时 方案数为f(3)*f(0);
    由上述条件可以推出:
      f(4)=f(0)*f(3)+f(1)*f(2)+f(2)*f(1)+f(3)*f(0);
    则当n时由以上结论可推:
      f( n )=f( 0 )*f( n-1 )+f( 1 )*f( n-2 )+f( 2 )*f( n-3 )......f( n-2 )*f( 1 )+f( n-1 )*f( 0 );

     证明二:

     我们用+1表示进栈,−1表示出栈,那么对n个数的序列,总的进出栈顺序是给2n个1前面挑n个添加+号,其他的添加−号,共C2nn种,但是其中有无效情况,因为出栈的前提是有进栈动作,于是要求每个排列中的前若干项和均不为负数,也就是说排列1,−1,−1,1,1,−1,−1,1是无效的。
     不符合要求的数的特征是从左到右扫描时,必然在某一位奇数位2m+1位上首先出现m+1个-1(这个是可以证明的)和m个1,此后的2(n - m ) - 1位上有n - m个1和n - m - 1个-1。如若把后面这2(n - m)-1位上的-1和1互换,使之成为n - m个-1和n - m - 1个1,结果得1个由n + 1个-1和n - 1个1组成的2n位数。
     反过来,任何一个由n + 1个-1和n - 1个1组成的2n位数,由于-1的个数多两个,2n为偶数,故必在某一个技术位上出现的-1的个数超过1的个数。同样在后面部分的-1和1互换,使之成为由n个-1和n个1组成的2n位数,即n + 1个-1和n - 1个1组成的2n位数对应一个不符合要求的数,因而不合要求的2n位数与n + 1个-1,n - 1个1组成的排列一一对应。显然,不符合要求的方案书C2nn+1,由此得出,输出序列的总数目为C2nn -C2nn+1 = 1/(n+1)*C2nn

    证明三:(来自《计算机程序设计艺术》第三版,Donald E.Knuth著,苏运霖译,第一卷,508页

    用S表示入栈,X表示出栈显然有C(2n, n)个含S,X各n个的序列,剩下的是计算不允许的序列数(它包含正确个数的S和X,但是违背其它条件)。
    在任何不允许的序列中,定出使得X的个数超过S的个数的第一个X的位置。然后在导致并包括这个X的部分序列中,以S代替所有的X并以X代表所有的S。结果是一个有(n+1)个S和(n-1)个X的序列。反过来,对一垢一种类型的每个序列,我们都能逆转这个过程,而且找出导致它的前一种类型的不允许序列。例如XXSXSSSXXSSS必然来自SSXSXXXXXSSS。这个对应说明,不允许的序列的个数是C(2n, n-1),因此总数目为 C(2n, n) - C(2n, n-1)。

    2、所有在n × n格点中不越过对角线的单调路径的个数。

    忽略限制条件不越过对角线,很容易知道共有方案数C2nn,因为无论如何都要走2n步,并且其中n步是向上走的,其中n步是向右走的。

    有了限制条件后,我们只要减去超过对角线的就好。如果路径超过了对角线,那么一定和y=x+1这条线相交;为了计算出这部分的方案数,我们将路径在第一次与y=x+1这条线相交之前的部分,沿着y=x+1对称过去:现在我们发现这部分的路径在对称后,都变成了从(−1,1)到(n,n)的路径,而且是单一映射,并且是满射,换句话说,每个超过了对角线的路径,都能找到从(−1,1)到(n,n)的路径与之对应,反之亦然。所以我们就能得到方案数是C2n-C2nn+1

    3、有n个左括号,n个右括号,现在问有多少种排列,使得整个排列是个合法的括号序列

    4、将n + 2条边的凸多边形剖分成若干个三角形的不同方案数是多少

    5、现在有2n个人,每个人的身高从1到2n,现在排成两排,使得从左到右,从上到下都是递增的
    如n=5有下面的一种排列方法:
    1 3 4 5 6
    2 7 8 9 10
    这个问题本质上和括号序列是一样的,我们将左括号的下标写在第一行,右括号的下标写在第二行,就是答案。

  • 相关阅读:
    VS2012写的程序在VS2010打开时显示当前版本不兼容
    (转载)Sumblime Text 2 常用插件以及安装方法
    (转载)Nginx防盗链的几种方法
    C#对字符串执行字节操作
    转载:自动生成数据库文档
    SQL SERVER “扩展属性"的应用
    使用EventLog实现事件日志操作
    SQL SERVER2005无日志文件附加数据库最简单的方法(转载)
    网站分析工具Google Analytics
    学习使用master.dbo.spt_values表
  • 原文地址:https://www.cnblogs.com/ZhaoxiCheung/p/5925267.html
Copyright © 2011-2022 走看看