zoukankan      html  css  js  c++  java
  • 卡特兰数爽文讲解

    这个文章是基于别的博客来讲的,反正根据自己的理解,然后写出来的。欢迎大佬吐槽。

    卡特兰序列:1,1,2,5,14,42,132,429,1430...   通项就是

    卡特兰数:卡特兰序列中的每一项,为卡特兰数, 既:

    卡特兰数的引入:

      在组合数学中有一类问题,为计数问题,比如正常的排列组合,斐波拉契数列等等都可以用来计数。

      现在给出一个情景:对于一个n*n的正方形网格,每次我们都能向右或者向上移动一格,并且,路径在网格的下三角形的区域内,那么从(0,0)->(n, n)总的路径为多少?

      

    这样的路径就满足,如图所示的样子。

    我们可以从中明显看出,1.向右的步数为n,向左也为n。   2.如果设向右的一步为1,向上一步为-1,那么整个路径就是,a1+a2+a3+.....a2n;只是从中选取n个向右或者向上走,

      但是,由于不超过y=x这个线,也就得到,a1+a2+...ak>=0(k<=2n)

    而卡特兰数也就是在计数这样的路径有多少条。

    现在,我们来推导一下这个过程:假设所有到达(n, n)的路径(不管,超不超过y=x)为Cn,假设到达(n, n)并且一定会超过y=x这个线为Dn,

    那么

      现在,把注意力放在求Dn上,首先要明白Dn是能到达(n, n)并且一定超过y=x的路径。那么它有三个性质:

      1.向右和向上的步数都为n    2.都存在一个唯一的第k步第一次超过y=x这个直线上。(每条路径的k一定不同,无需证明)

      3.第k步一定是向上一格子。而且,一定为奇数步,因为,k-1步一定刚好在y=x这个直线上。而如图所示k-1一定为偶数。

                                                                                          

      关键点:我们既然已经知道了,Dn中计数的所有路径的性质,那么,我们现在就主观处理一下,我们将1-k步的向上和向右的步骤互换(也就是将向右换为向上,向上换成向右),得到n+1的向右步,n-1的向上步,则(这里再次强调一下,我们是主观的这样处理的,至于为什么这样做,我不能给出一个非常严格的数学推理,但是,我可以给出自己的理解:在一个排列公式中,从2n个中选取n+1个事物出来,其中一个非常隐藏的条件是这2n个事物‘不同’,比如,从10个相同的小球中选取2个小球的方案数,这样的问题是没有意义的。因为都是相同的小球,但是,我们Dn在使用排列公式时怎么满足这个大前提呢?那是因为每条路径的k-1的值是不同的。)

    卡特兰数的一些性质:

      1.

    推导过程:

      2.

      3.

      

      4.

      5.   ‘~’这是个等价无穷小的符号,然后就知道这个式子可以表述增长趋势的表达。

    当然,比较关键的是在实际问题中的应用了:

      下面给出的均不给出严格证明:

      1.在n个-1和n个+1的2n项 {a(2n)} 满足:a1+a2+a3...ak>=0,  0<=k<=2n  条件的序列的个数等于第n个卡特兰数Cn;

      2.存在n对括号对,然后把它们打乱形成的新序列,该序列满足 括号配对 条件的序列的个数等于第n个的卡特兰数Cn;

      3.n+1个数连乘,在加上合法的括号后,形成不同的乘法顺序的序列的个数等于第n个卡特兰数Cn;

        (比如;abcd这个式子-> {a(b(cd)), (ab)(cd), ((ab)c)d, (a(bc))d, a((bc)d) } 等于卡特兰数C3=5 )

      4.n个节点的二叉树的所有可能形态等于第n个卡特兰数Cn;

      5.n个非叶节点的满二叉树的形态数等于第n个卡特兰数Cn;

      6.对于有一个n*n的网格,每次只能向上或者向右移动一格,那么从(0,0)->(n, n),所有的了路径只在右下三角形区域或者左上三角形区域

       的总的路径条数为第n个卡特兰数;

      

      7.凸n+2边形进行三角形划分的方案数为第n个卡特兰数Cn;

      

      8.n个数字入栈后出栈的序列的个数等于第n个卡特兰数Cn;

      9.对于集合{1,2,...,2n},每次选出一对数字,这样形成的n个数对,能形成n个区间,这n个区间不相交。满足这样选择的方案数等于第n个

       卡特兰数Cn;

       这样才是不相交:     

      10.n层的阶梯切割成n个矩阵的切法数等于第n个卡特兰数Cn;

      

      11.在一个2*n的格子中填入1到2n这些值使得每个格子内的数都比右边和上面的所有数都小的所有情况数等于第n个卡特兰数Cn;

      12.平面上链接可以形成的凸包的2n个点分成2个一条线,形成n条线,并满足两两不相交的总情况数等于第n个卡特兰数Cn; 

    卡特兰数的一个拓展:

        标准的卡特兰数都是存在n个向上,n个向右,但是,如果不同怎么办呢?

        我们推广到一般形式:有n个向上,m个向右,那么边界就由原来的y=x,变成了y=(n/m)x这一条直线了,

        那么最后同理推导出来的公式就是: 

    参考博客:http://daybreakcx.is-programmer.com/posts/17315.html

    希望能对您有帮助。

  • 相关阅读:
    mysql获取当前时间,及其相关操作
    notepad++ 样式随我变!
    MySQL索引的创建、删除和查看
    so easy 的弹出层——使用jquery
    mysql获取当前时间,及其相关操作
    侯捷大师畅谈技术人生与读书感悟
    《海量数据库解决方案》之聚簇表的代价
    博文视点大讲堂第44期——招聘真相全揭秘 圆满结束
    程序员修炼道路上的“葵花宝典”——博文视点大讲堂42期快乐结束
    众专家推荐
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10441103.html
Copyright © 2011-2022 走看看