卡特兰数
英文名
Catalan number
, 是组合数学中一个常出现在各种计数问题中出现的数列。其前几项为:
1 1 2 5 14 42 132 429 1430 4862 16796 58786 208012 742900 2674440 9694845 35357670 129644790 477638700 1767263190 6564120420 24466267020 91482563640
343059613650 1289904147324 4861946401452…
通项公式
卡特兰数的通项公式不止一种
k
(
0
)
=
1
,
k
(
1
)
=
1
k(0)= 1, \;k(1)= 1
k(0)=1,k(1)=1 ,如果接下来的项满足以下三种公式中的一种就是卡特兰数
- k ( n ) = k ( 0 ) × k ( n − 1 ) + k ( 1 ) × k ( n − 2 ) + ⋅ ⋅ ⋅ + k ( n − 2 ) × k ( 1 ) + k ( n − 1 ) × k ( 0 ) k(n) = k(0) \times k(n- 1) + k(1) \times k(n- 2)+ \cdot\cdot\cdot +k(n- 2) \times k(1) + k(n- 1) \times k(0) k(n)=k(0)×k(n−1)+k(1)×k(n−2)+⋅⋅⋅+k(n−2)×k(1)+k(n−1)×k(0)
- k ( n ) = C 2 n n − C 2 n n − 1 k(n)= C_{2n}^n - C_{2n}^{n-1} k(n)=C2nn−C2nn−1
-
k
(
n
)
=
C
2
n
n
n
+
1
k(n)= \frac{C_{2n}^n}{n+1}
k(n)=n+1C2nn
这个公式就是复习408时背的n个元素进栈,有多少种出栈排列结果
常用的是范式1和2,3几乎不会使用到
括号匹配问题
这个问题模型非常重要,它包含了如何套用卡特兰数并且包含了一种重要的数学性质,有很多问题如果能转换成括号匹配模型就迎刃而解了。
问题描述
给你n个左括号(
和n个右括号)
,有多少种合法的摆放序列?
首先要回答最关键的问题:什么叫做不合法?一个长度为2n的字符串中,只要有任意一个前缀是:右括号的数量比左括号的数量多1,就说这个排列是不合法的
eg:
(
)
)
(
(
)
)
(\;)\;)\;(\;(\;)\;)
())(()) 就是不合法的,因为其前缀())
违规。
所以,要求有多少种合法的排序,我们只需要用总的排列种数减去不合法的种数
现在问题就转化成了:有多少种不合法的排列 总的排列数很好算,是:
C
2
n
n
C_{2n}^n
C2nn 2n个位置中任意选n个位置放左括号。
现在要引入一个非常重要的数学概念等势。假如有集合A,B,存在一个一一映射 f f f ,使得A中的每个元素都能映射到B中的唯一一个元素。由此可以得到: A 的元素数量 ≤ B 的元素数量 A的元素数量 \le B的元素数量 A的元素数量≤B的元素数量;如果同样存在这样一个由B到A的映射 g g g ,那么就有: B 的元素数量 ≤ A 的元素数量 B的元素数量 \le A的元素数量 B的元素数量≤A的元素数量 结合来看就有: A 的元素数量 = B 的元素数量 A的元素数量 = B的元素数量 A的元素数量=B的元素数量
假设2n个括号中所有不合法的排列为集合A,我们现在就是要找和A等势的集合B。我们可以这样定义 f f f :
任意一个不合法的排列,必定存在一个最短前缀使得右括号比左括号多1,找到这个最短前缀,假设其长度为 2 m + 1 2m+1 2m+1 ,必然是奇数长度,对于剩下所有的 2 n − ( 2 m + 1 ) 2n-(2m+1) 2n−(2m+1) 个括号,让左括号变右括号,右括号变左括号。如下表:
最短前缀 | 剩下部分(变化前) | 剩下部分(变化后) | |
---|---|---|---|
长度 | 2m+1 | 2n-2m-1 | 2n-2m-1 |
左括号数量 | m | n-m | n-m-1 |
右括号数量 | m+1 | n-m-1 | n-m |
所以变化后的整个字符串最短前缀那部分是不变的,变动的是后部分,并且总体上左括号有: n − 1 n-1 n−1
右括号有: n + 1 n+1 n+1 。这样 f f f 定义好后, g g g 也可以水到渠成地得到,将这个字符串找出最短的违规前缀,让
剩余部分右变左,左变右就能得到原始串,并且是一一对应,所以我们找到了A的等势集合B,集合B是什么呢? 集合B就是总共2n个括号,n-1个左括号,n+1个右括号的所有排列
,我们找到了这个集合B,并且还证明了和我们想求的集合A是等势的,但是集合B的大小非常好得到就是:
C
2
n
n
−
1
C_{2n}^{n-1}
C2nn−1 ,所以最终的答案就是:
C 2 n n − C 2 n n − 1 C_{2n}^n - C_{2n}^{n-1} C2nn−C2nn−1 这就是通项公式2
其他一些可以转化成括号匹配模型的问题
n个元素入栈,有多少种出栈次序
可以把进栈想成 ↓ 出栈想成 ↑,n个元素进栈,最后也是出栈n次,所以总长度为2n,是不是任意时刻出栈次数都不能超过进栈次数,也就是说最终的整个长度为2n的序列,任意前缀都不能有↑超过↓,是不是和括号匹配一模一样的?
一个公司的股票走势要么是上涨↗️,要么是下降↘️,不管是什么走势,和水平线的夹角都是45度,每个时刻都有一个走势,那么n时刻时,该走势图进入第四象限的可能?
也是在问括号的结合方式
一共有n个结点,问可以组成多少种不同的二叉树
k
(
0
)
=
0
,
k
(
1
)
=
1
,
k
(
2
)
=
2
k(0)=0, \; k(1)=1, \; k(2)=2
k(0)=0,k(1)=1,k(2)=2 n>2时,要这样考虑:
根结点必然是包含1个结点的,就是左边0个,右边n-1个。。。。每一种的组合方式累加起来,就得到结果了,虽然 k ( 0 ) × k ( n − 1 ) = k ( n − 1 ) × k ( 0 ) k(0) \times k(n-1) = k(n-1) \times k(0) k(0)×k(n−1)=k(n−1)×k(0) 但是在二叉树中,形状不同就是不同。所以就有:
k ( n ) = k ( 0 ) × k ( n − 1 ) + k ( 1 ) × k ( n − 2 ) + ⋅ ⋅ ⋅ + k ( n − 2 ) × k ( 1 ) + k ( n − 1 ) × k ( 0 ) k(n) = k(0) \times k(n- 1) + k(1) \times k(n- 2)+ \cdot\cdot\cdot +k(n- 2) \times k(1) + k(n- 1) \times k(0) k(n)=k(0)×k(n−1)+k(1)×k(n−2)+⋅⋅⋅+k(n−2)×k(1)+k(n−1)×k(0)
这不就是卡特兰数通项公式1嘛