卡特兰数和出栈序列的关系

卡特兰数是组合数学里的一个概念,然而不少人都在一些面试里直接看到考卡特兰数的题:

比如直接找规律的题?1,1,2,5,14,(?)

不知道卡特兰数你猜的出来?

好了,回到正题。

首先什么是卡特兰数:h(n)

令h(0)=1,h(1)=1,catalan数满足递推式 [2]  :

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

另类递推式 [3]  :

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,...)

总的就是:h(n)=c(2n,n)/(n+1) 

-----------------------------------------------------------------------------------------------------------------------------------------------------------

卡特兰数和栈什么关系?

一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?

首先,我们设f(n)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则,由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有f(k-1)种,而之后比k大的值入栈,且都在k之前出栈,因此有f(n-k)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,f(n-k)*f(k-1)种,求和便是Catalan递归式。

那么还有另一个问题:给定一个以字符串形式表示的入栈序列,判断那种出栈是合法的?

介绍个规律:

对于出栈序列中的每一个数字,在它后面的、比它小的所有数字,一定是按递减顺序排列的。

比如入栈顺序为:1 2 3 4。

出栈顺序:4 3 2 1是合法的,对于数字 4 而言,比它小的后面的数字是:3 2 1,且这个顺序是递减顺序。同样地,对于数字 3 而言,比它小的后面的数字是: 2 1,且这个顺序是递减的。....

出栈顺序:1 2 3 4 也是合法的,对于数字 1 而言,它后面没有比它更小的数字。同样地,对于数字 2 而言,它后面也没有比它更小的数字。

出栈顺序:3 2 4 1 也是合法的,对于数字 3 而言,它后面比 3 小的数字有: 2 1,这个顺序是递减的;对于数字 2 而言,它后面的比它 小的数字只有 1,也算符合递减顺序;对于数字 4 而言,它后面的比它小的数字也只有1,因此也符合递减顺序。

出栈顺序:3 1 4 2 是不合法的,因为对于数字 3 而言,在3后面的比3小的数字有:1 2,这个顺序是一个递增的顺序(1-->2)。

因此,当给定一个序列时,通过这个规律 可以轻松地判断 哪些序列是合法的,哪些序列是非法的。

这个规律是什么原理呢?

注意:k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有f(k-1)种,而之后比k大的值入栈,且都在k之前出栈。

1 2 3 4,对4而言,比他小的数,提前先出栈了,和他没关系,同理,对3而言,12什么顺序和他没关系。

因此一个数往右看,比他大的数和他没关系。

3 1 4 2 是不合法的,为什么?一个数往右看比他小的数 ,比如2是3往右看到的,是最后出栈的,1和她没关系,但是3,4应该是在2入栈后在入栈的,可以想象1必须在2之前,然后栈里面2在底部,比2大的先出栈,但是出去也一定是在1之后,因此可以是1342或者1432.

一个数往右看比他小的数如果是升序,就会出现这样的情况。若是降序则OK。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

参考:

出栈顺序....

百度

发布了16 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_37634774/article/details/82898149