对 卡特兰数 两种公式的原理分析

通过栈对 卡特兰数 两种公式的原理分析


公式一:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

公式二

对公式一的理解:

在理解这个问题之前,我们先来看看另一个问题:在一次完整的进栈出栈的顺序中,最后一个出栈元素有什么意义?

先假设对于x个元素进栈有 h(x) 种出栈情况。对于进栈序列 a1,a2,a3,a4,a5 ,他们出栈的情况有 h(5) 种。其中 a1,a2,a3,a4,a5 他们之中任意一个都可能成为最后一个出栈的元素。假设元素 a3 最后出栈,那么我们可以知道从 a3进栈 到 栈里只剩最后一个元素a3 这段时间里,a3一直处于栈底的位置 。这就意味着 a3 将 一个有5个元素的出栈问题分为了两个相互独立的 规模更小的问题。

根据这一特点,我们就可以得出 h(x) 的递推公式。

也就是说,如果不看a3:在a3之前,是一个完整的 a1,a2 进栈+出栈的过程,它有 h(2) 种出栈情况;在a3之后,是一个完整的 a4,a5 进栈+出栈的过程,它有 h(2) 种出栈情况。这两部分的情况可以随意组合,所以,当 a3 是最后一个出栈的元素时就有 h(2)*h(2) 种出栈情况。同理可得当最后一个出栈的元素是 a1,a2,a4,a5时的出栈情况的数量,而总的出栈情况就有 h(5)=h(0)*h(4) + h(1)*h(3) + h(2)*h(2) + h(3)*h(1) + h(4)*h(0) 种。

所以,就有递推公式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

对公式二的理解:

公式二可以由公式一通过数学推导得出,对它的理解为:

对于一个n个元素的出栈问题,令1表示进栈,0表示出栈,则可转化为求一个2n位、含n个1、n个0的二进制数,满足从左往右扫描到任意一位时,经过的0数不多于1数(也就是1的个数>=0的个数)。显然含n个1、n个0的2n位二进制数共有 C(n,2n) 个。所以就有:h(n)=C(n,2n)-(不满足条件的情况总数);

下面分析不满足条件的情况数量:

对于上述的长度为2n的 0,1 串,从左往右扫描时,设第一次出现0比1多的时候,1有m个;此时,易知已扫描的有m个1和m+1个0,未扫描的有n-m个1和n-m-1个0;此时如果将未扫面部分的0换1,1换为0,(总的组合数量不会受到影响) 那么在长度为2n的串里0一共有 (m+1+n-m)=n+1 个。所以总的不满足条件的组合数量= C(n+1,2n)。

所以就有:h(n)=C(n,2n)-C(n+1,2n)

再通过数学推导,就有:h(n)=C(n,2n)-C(n+1,2n)=C(n,2n)/(n+1)

如果还是不能理解,可以看看下面这篇博客:

卡特兰数(Catalan)的原理和题目:https://blog.csdn.net/u010325193/article/details/85695168


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值