卡特兰数及相关应用场景

卡特兰数(Catalan numbers)是一类在组合数学中频繁出现的整数序列,以比利时数学家欧仁·查理·卡特兰(Eugène Charles Catalan)的名字命名。这个数列在许多看似无关的问题中都会自然出现,具有丰富的组合解释。


一、卡特兰数的定义

第nnn 个卡特兰数 CnC_nCn 的公式为:

Cn=1n+1(2nn)=(2n)!(n+1)! n! C_n = \frac{1}{n+1} \binom{2n}{n} = \frac{(2n)!}{(n+1)! \, n!} Cn=n+11(n2n)=(n+1)!n!(2n)!

其中(n≥0)( n \geq 0 )(n≥0),且 (C0=1)( C_0 = 1 )(C0=1)。

前几项卡特兰数为:

C0=1,C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,... C_0 = 1,\quad C_1 = 1,\quad C_2 = 2,\quad C_3 = 5,\quad C_4 = 14,\quad C_5 = 42,\quad C_6 = 132,\quad \dots C0=1,C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,...


二、递推关系

卡特兰数满足以下递推公式:

C0=1,Cn+1=∑i=0nCiCn−i(n≥0) C_0 = 1,\quad C_{n+1} = \sum_{i=0}^{n} C_i C_{n-i} \quad (n \geq 0) C0=1,Cn+1=i=0∑nCiCn−i(n≥0)

也可以写成:

Cn=∑i=0n−1CiCn−1−i C_n = \sum_{i=0}^{n-1} C_i C_{n-1-i} Cn=i=0∑n−1CiCn−1−i

此外,还有更高效的线性递推形式:

Cn+1=2(2n+1)n+2Cn C_{n+1} = \frac{2(2n+1)}{n+2} C_n Cn+1=n+22(2n+1)Cn


三、卡特兰数的典型应用(组合解释)

卡特兰数出现在大量组合结构的计数问题中,例如:

  1. 合法括号序列
    CnC_nCn 表示由 nnn 对括号组成的合法(即正确匹配)括号序列的个数。

  2. 二叉树的个数
    CnC_nCn 表示有 nnn 个内部节点的不同构的满二叉树(或有 n+1n+1n+1 个叶节点的二叉树)的数目。

  3. 凸多边形三角剖分

    将一个凸 (n+2)(n+2)(n+2)边形用不相交的对角线划分为三角形的方法数是 CnC_nCn。

  4. Dyck 路径

    从 (0,0)(0,0)(0,0) 到 (2n,0)(2n,0)(2n,0) 的路径,每步向上 (1,1)(1,1)(1,1) 或向下 (1,−1)(1,-1)(1,−1),且不穿过 x 轴下方的路径数为 CnC_nCn。

  5. 出栈序列

    一个栈的进栈序列为 (1,2,...,n)( 1,2,\dots,n )(1,2,...,n),可能的出栈序列总数为 CnC_nCn。

  6. 非交叉划分

    在圆上标出 2n2n2n个点,将其两两配对且连线不相交的方式数为 CnC_nCn。


四、生成函数

卡特兰数的普通生成函数 C(x)=∑n=0∞CnxnC(x) = \sum_{n=0}^{\infty} C_n x^nC(x)=∑n=0∞Cnxn 满足:

C(x)=1+xC(x)2 C(x) = 1 + x C(x)^2 C(x)=1+xC(x)2

解得:

C(x)=1−1−4x2x C(x) = \frac{1 - \sqrt{1 - 4x}}{2x} C(x)=2x1−1−4x


五、小结

为什么这么多问题都归结为卡特兰数?

因为它们共享以下组合结构特征
递归可分 :整体可分解为两个独立的子问题。
非交叉/不越界 :子结构之间不能"交错"或"穿透"。
平衡性 :如括号匹配中的左右平衡、路径中的上下步平衡。
一一对应:这些问题之间存在双射(bijection),即可以互相转换。

卡特兰数因其简洁的形式和广泛的应用,成为组合数学中的经典对象。如果你在算法、数据结构、离散数学或编程竞赛中遇到"合法配对"、"不交叉"、"不越界路径"等限制条件下的计数问题,很可能就与卡特兰数有关。

相关推荐
一个不知名程序员www17 小时前
算法学习入门 --- 哈希表和unordered_map、unordered_set(C++)
c++·算法
Sarvartha18 小时前
C++ STL 栈的便捷使用
c++·算法
夏鹏今天学习了吗19 小时前
【LeetCode热题100(92/100)】多数元素
算法·leetcode·职场和发展
飞Link19 小时前
深度解析 MSER 最大稳定极值区域算法
人工智能·opencv·算法·计算机视觉
bubiyoushang88819 小时前
基于CLEAN算法的杂波抑制Matlab仿真实现
数据结构·算法·matlab
2401_8948281220 小时前
从原理到实战:随机森林算法全解析(附 Python 完整代码)
开发语言·python·算法·随机森林
Remember_99320 小时前
【LeetCode精选算法】前缀和专题二
算法·哈希算法·散列表
源代码•宸20 小时前
Leetcode—509. 斐波那契数【简单】
经验分享·算法·leetcode·面试·golang·记忆化搜索·动规
博大世界21 小时前
matlab结构体数组定义
数据结构·算法
Loo国昌21 小时前
【LangChain1.0】第九阶段:文档处理工程 (LlamaIndex)
人工智能·后端·python·算法·langchain