卡特兰数 [转载]

me 一个童鞋跟 me 提过一个问题:说1-12 这 12 个数,分红 2 组,而后每组按大小排序,其中一组中的数老是比另一组中对应顺序的数要大,问有多少种状况?me 还真作不出来,他告诉 me 说这是Catalan数。即便他这么说,me 貌似仍是不太明白。不过这不影响,me 简单搜索一下这个数(其实me之前就有所耳闻),有好几个用处,简单罗列一下。app

平衡括号

平衡括号:在一个合法的算术表达式中能够出现的括号都是平衡括号,更专业一点的说法应该是“全部的左括号和右括号能够创建一对一的对应关系,而且左括号在对应的右括号左侧”。像()(), (())(), (()())(()) 都是平衡括号,可是(()))(, ()())() 就不是平衡括号。函数

观察一下特色,判断所给的一个括号串是否是平衡很容易:设置一个计数器,初始值为 0,而后从左向右数,遇到左括号 +1,遇到右括号 -1,在过程当中不出现负数,而且最终的计数器仍是 0,那么就是平衡括号;除此以外就是非平衡括号。排序

如今的问题是,若是有 n 对括号,问平衡的状况有多少种?暂时能够数一下 n = 1, 2, 3, 4 时的状况:递归

n = 1: ()
n = 2: ()(),   (())
n = 3: ()()(),  ()(()), (())(), (()()), ((()))
n = 4:()()()(), ()()(()), ()(())(), ()(()()), ()((())), (())()(), (())(()), (()())(), ((()))(), (()()()), (()(())), ((())()), ((()())), (((())))

入栈出栈

问:n 个数入栈出栈,问状况有多少种?get

好比所有入进去而后倒退出栈是 1 种;入一个出一个,所有都这样,是 1 种。入栈出栈的状况和n个数相不相同没有关系。由于能够视第一个入栈的为 1,第二个为 2,最后一个为 n。若是是 n 个相同的数的入栈出栈状况,假设数字都是括号,入栈是左括号,出栈是右括号,那么一种入栈出栈状况应该就对应平衡括号中的一种状况,因此,该问题和问题1是等价问题。二叉树

走方格

问:一个 n*n 的方格,从左下角走到右上角,只能向右和向上走,可是不能绕过左下角和右上角肯定的对角线,问有多少种走法?搜索

若是将向右走看作是入一下栈,向上走是出一下栈,不能绕道对角线以上,也就是一种合法的入栈出栈,从左下角开始到右上角,要入 n 次栈出 n 次栈,因此一种走法对应一种 n 个数的入栈出栈状况,因而,此问题和问题2是等价问题;方法

二叉树的形状

问:n 个结点的二叉树的形状有多少种?co

所谓的二叉树,就是有一个根结点,有棵左子树还有一棵右子树。n = 3: ()()(), ()(()), (())(), (()()), ((())) 时的括号匹配,me 们换个角度看这个表示:第一个成对的括号是树根,括号内部的子串和括号右边的子串依然是平衡括号串,把内部的看作是左子树,把右边的当作是右子树,好比(())()对应的是有一个左节点和一个右节点的二叉树,()()() 表示只有右子树的二叉树(右子树只有一个右结点);若是上面的对应成立(递归证实),那么二叉树的状况就和问题1 是等价问题;数字

矩阵链乘

问:A = A0 * A1 * A2 * ... * An,Ai 都是矩阵,式子合法,那么问,若是使用括号来改变计算顺序的话,计算方法有多少种?

原本的乘法运算是从左到右运算,me 们将运算使用栈模拟一下:首先将 A0 压入栈底,而后看 A1,和栈顶的 A0 计算结果,栈顶 A0 出栈而结果入栈;看A2,和栈顶元素计算结果,栈顶元素出栈、结果入栈;...若是使用括号改变了顺序,好比A0*(A1*A2)*...看A1的时候,入栈不计算结果,看A2的时候,计算结果,A1出栈结果入栈;...若是这样看来的话,每一种计算顺序,实际上对应一种 A0-A(n-1) 的入栈出栈状况,因而,此问题和问题2等价;

...

有时候上面几个问题的等价不是那么明显,然而上面的几个问题均可以用同一个递推公式来表示:

C0 = 1 ; 
Cn = ∑ Ci · C(n-1-i) ;

举例:
C0 = 1; C1 = 1; C2 = 2; C3 = 5; C4 = 14;
C5 = C0C4 + C1C3 + C2C2 + C3C1 + C4C0 = 14+5+4+5+14 = 42

上面的几个问题都是等价问题,所得的数就是 Catalan 数,能够计算出通项公式(能够使用生成函数法):

Cn = C(n,2n)/(n+1)
,其中C(m,n)是 n 个不一样的数中取 m 个数造成的组合数;

注:C5 = 42,介貌似是一个灰常有名的数,能够记一下。

相关文章
相关标签/搜索