卡特兰数的理解
1.【排列组合题】有N对括号,输出所有合法的组合
-
总排列数
左括号数为n,右括号数为n,可以得到总排列数为C(2n, n)
。
上式可以理解为:从2n
个位置里选择n
个左括号填入。 -
不合法的组合
记左括号(
为1
,右括号)
为-1
,在n = 3
的时候观察下面一种情况:( ) ) ( ( )
对应的表示为序列1 -1 -1 1 1 -1
其中,“
( ) )
”——也就是“1 -1 -1
”这一部分,是第一次出现右括号比左括号多的片段。将这一部分做翻转,得到序列-1 1 1 1 1 -1
,是一个由3-1
个-1
和3+1
个1
组成的。可以证明,每一个非法的排列通过如上的变换方式,可以得到
n-1
个-1
和n+1
个1
所组成的排列。(证明略)而且,也可以证明,每一个
n-1
个-1
和n+1
个1
所组成的排列通过上述变换的逆变换,可以得到与之对应的唯一非法排列。也就是说,二者是一一对应的。因此,可以导出:所有不合法的排列数
= n+1个1和n-1个-1组成的排列数
= C(2n, n+1)或者C(2n, n-1)
-
合法的组合
由上一点的结论可以得出:
所有合法的排列数
= 总排列数 - 所有不合法的排列数
= C(2n, n) - C(2n, n+1)
= [1/(n+1)] * C(2n, n)
-
卡特兰数重要的公式之一:
C(2n, n) - C(2n, n+1) = [1/(n+1)] * C(2n, n)
2.【排列组合题】n个数进出栈问题
n个数进出栈的顺序有多少种?假设栈的容量无限大。
解法和上一个案例相同:
进栈相当于左括号,出栈相当于右括号,所以答案还是卡特兰数:
[1/(n+1)] * C(2n, n)
n就是题干中的n个数
3.【排列组合题】2n个人买票问题
2n个人排队买票,n个人手拿5块钱,n个人手拿10块钱,票价是5块钱一张,每人买一张票,售票员受理没有零钱。问有多少种排队方法可以让售票员顺利卖票。
还是卡特兰数的应用,5块钱相当于左括号,10块钱相当于右括号,答案还是卡特兰数:
[1/(n+1)] * C(2n, n)
n就是题干中的n个人
4.【排列组合题】求n个无差别的节点构成的二叉树有多少种不同的结构
假设n个无差别的节点构成的结构数为f(n)
f(0)
表示空树,所以规定种数为1种
进行下面的分析:
①以1节点作为头部:结构数1*f(n-1)
②以2节点作为头部:结构数1*f(n-2)
③以3节点作为头部:结构数f(2)*f(n-3)
④以4节点作为头部:结构数f(3)*f(n-4)
……
O
O O…O O O (n个节点)
O O
O…O O O (n个节点)
O O O
O…O O (n个节点)
O O O O
O…O (n个节点)
……
总结如下:
初始值满足f(0) = f(1) = 1, f(2) = 2, f(3) = 5
下列结构
f(n) = f(0)*f(n-1) + f(1)*f(n-2) + f(2)*f(n-3) + f(3)*f(n-4) + …… + f(n-1)*f(n)
= [1/(n+1)] * C(2n, n)
——上式为卡特兰数的重要公式2
5.【排列组合题】有12个高矮不同的人排两排问题
有12个高矮不同的人,排成两排,要求:每排必须是从矮到高排列,而且第二排对应比第一排的人高,问排列方式有多少种?
此题又是一个卡特兰数问题,只是隐藏的很深。 我们假设:
0:排在第一排
1:排在第二排
则12个人从低到高排列后,可以用0和1表示,示例如下
如果前缀(前n个数)出现1比0多的情况,这种排列必然是不合法的。
这时,问题变为任意前缀不能出现1比0多的情况,问题又等价于n组括号合法的问题,答案还是[1/(n+1)] * C(2n, n)
,这里的n是12/2 = 6
.