卡特兰数
卡特兰数的推导公式是:
f
(
n
)
=
∑
k
=
1
n
f
(
k
−
1
)
f
(
n
−
k
)
f(n) = \sum_{k=1}^n{f(k-1)f(n-k)}
f(n)=∑k=1nf(k−1)f(n−k)
f
(
0
)
=
1
f(0) = 1
f(0)=1
f
(
1
)
=
1
f(1) = 1
f(1)=1
它和斐波那契数列是很相似的都是将后面的问题分解为前面的问题。
进出栈问题
栈是一种先进后出(FILO,First In Last Out)的数据结构.如下图1,2,3,4顺序进栈,那么一种可能的进出栈顺序是: 1 I n → 2 I n → 2 O u t → 3 I n → 4 I n → 4 O u t → 3 O u t → 1 O u t 1In→2In→2Out→3In→4In→4Out→3Out→1Out 1In→2In→2Out→3In→4In→4Out→3Out→1Out, 于是出栈序列为1,3,4,2。对于一个还有 n n n个数的数组来说,假设第 k k k个为最后出栈那么有 f ( k ) f(k) f(k)在它前面出栈,以及 f ( n − k ) f(n-k) f(n−k)在它后面出栈,因此对于第k个数最后出栈它有 f ( k ) f ( n − k ) f(k)f(n-k) f(k)f(n−k)种方式,又因为所以数可能是最后一个出栈因此所有可能就是一个卡特兰数。
二叉树构成问题
有n个结点,问总共能构成几种不同的二叉树。如果采用中序遍历的话,根结点第k个被访问到,则根结点的左子树有k-1个点、根结点的右指数有n-k个点。k的取值范围为1到n,因此也是一个卡特兰数。
突多边形的构成
对于一个凸多边形,假设它有 n + 2 ( n > = 1 ) n+2(n>=1) n+2(n>=1)个节点,随机选取一条边作为基,然后它与第 k k k个节点分别否可以连接并且将它们分为两部分,那么其中 k k k个节点可以有 f ( n − k ) f(n-k) f(n−k)种情况,剩下的 n − k n-k n−k个节点有 f ( n − k ) f(n-k) f(n−k)种情况。因此也是一个卡特兰数。
律师上班问题
一个n*n的格子,只能往上或者往右走,假设走到
k
k
k,则前面有
f
(
k
)
f(k)
f(k),后面有
f
(
n
−
k
)
f(n-k)
f(n−k),因为k可以从0到n所以一共有
f
(
n
)
f(n)
f(n)种。
括号匹配问题(5元10元买汽水问题)(XY,其中X排在前面的个数大于等Y问题)这三个问题是等价的
一个有n个X和n个Y组成的字串,且所有的部分字串皆满足X的个数大于等于Y的个数。以下为长度为6的dyck words:
XXXYYY XYXXYY XYXYXY XXYYXY XXYXYY
将上例的X换成左括号,Y换成右括号,Cn表示所有包含n组括号的合法运算式的个数:
((())) ()(()) ()()() (())() (()())
这些问题都可以归并为进出栈问题来解答,假设有
n
n
n个5元的人,先排号队1到n那么选取第k个人最后一个出栈那个前面有
f
(
k
)
f(k)
f(k)和后面的
f
(
n
−
k
)
f(n-k)
f(n−k)种方法,而这个k又可以从1到n$中选取,因此有卡特兰数种。