通过栈对 卡特兰数 两种公式的原理分析
公式一: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