卡特兰数应用

来源:互联网 发布:wpf编程宝典2013 pdf 编辑:程序博客网 时间:2024/04/28 15:26

      首先来回顾一下排列和组合的概念和计算公式。

      (1)排列:

      从n个不同元素中,任取m(m≤n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示.
      A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!(规定0!=1).

      注解:从n个不同的数中取m个数,第一次有n-0种取法,第二次有n-1种取法,......第m次有n-(m-1)种取法,故排列数对应取法相乘。 

      (2)组合:

      从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数.用符号c(n,m) 表示.
      c(n,m)=A(n,m)/m!=n!/((n-m)!*m!);c(n,m)=c(n,n-m);

      注解:组合是什么意思呢?m个不同元素就是一个组合,与排列顺序无关。那么1个组合对应m!个排列,反过来排列数除以m!就是组合数了。


      (3)卡特兰数

      令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,...)                                          公式五


     (4)卡特兰数应用

       假设有n对左右括号,请求出合法的排列有多少个?合法是指每一个括号都可以找到与之配对的括号,比如n=1时,()是合法的,但是)(为不合法。
给定一个整数n,请返回所求的合法排列数。保证结果在int范围内。


       分析:左右括号必须匹配才合法。n个左括号,n个右括号,共有C(2n,n)个排列。我们要求合法的排列数,反过来分析不合法的排列数。若n=3时


   ())(()这种情况就不合法。假设(表示1,)表示-1。该序列为1 -1 -1   1 1 -1

    前3个代表右括号比左括号多一个的情形。我们将1和-1交换,原序列变为 -1 1 1 1 1 -1。

    这就得到了我们的结论:


    任何一个非法序列都可以转换为n+1个1和n-1个-1的排列。

    故而我们可以知道非法排列有:C(2n,n+1)


    合法的序列即为:C(2n,n)-C(2n,n+1)


    由卡特兰数公式四和公式五即可算出。


    更多:


    

         2n个人排队买票,n个人拿5块钱,n个人拿10块钱,票价是5块钱1张,每个人买一张票,售票员手里没有零钱,问有多少种排队方法让售票员可以顺利卖票。

         给定一个整数n,请返回所求的排队方案个数。保证结果在int范围内。


          

         n个数进出栈的顺序有多少种?假设栈的容量无限大。

        给定一个整数n,请返回所求的进出栈顺序个数。保证结果在int范围内。


       (5)卡特兰数应用

    求n个无差别的节点构成的二叉树有多少种不同的结构?
    给定一个整数n,请返回不同结构的二叉树的个数。保证结果在int范围内。


    n个节点:1 2 3 ......n。如果头结点放在第一个位置,树的结构数有:1*f(n-1);头结点放在第二个位置,树的结构数有1*f(n-2);头结点放在第三个位置,树的结构数有f(2)*f(n-3)......

    依此类推,树的结构数共有:1*f(n-1)+1*f(n-2)+f(2)*f(n-3)......

    由卡特兰数公式一和公式四即可算出。


    补充:

        12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

        给定一个偶数n,请返回所求的排列方式个数。保证结果在int范围内。


    这个主要是注意n带入公式是n/2;因为n个人排两队就总共有n个人。而之前只是总共有2n个。解释下出入栈那道题,虽然仅有n个数,但是相当于进去n个,出来n个,所以也是总数为2n的排列组合问题。

      

0 0
原创粉丝点击