卡特兰数。

本文详细介绍了卡特兰数的基本概念、递归公式及其在多种典型问题中的应用,如括号化问题、出栈次序问题、多边形划分问题及二叉树构建问题等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

卡特兰数:规定C0=1,而C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,C7=429,C8=1430,C9=4862,C10=16796,

C11=58786,C12=208012,C13=742900,C14=2674440,C15=9694845·········································

卡塔兰数的一般项公式为 另类递归式: h(n)=((4*n-2)/(n+1))*h(n-1);

Cn的另一个表达形式为

h(n)= h(0)*h(n-1) + h(1)*h(n-2) + … + h(n-1)h(0) (其中n>=2)

hai可以这样推导出来:

n

推到过程

Cn

1

1

1

2

1 1

2

3

1 2 2

5

4

1 3 5 5

14

5

1 4 9 14 14

42

6

1 5 14 28 42 42

132

7

1 6 20 48 90 132 132

429

···

··· ···

···

所以,在做题的时候,我们应该用上面的公式Cn=Ck*Cn-k (k=1,2“n)来判断是否使用于katalan数来解决问题,合适就列出前几项来判断推到出答案

总结了一下,最典型的四类应用:(实质上却都一样,无非是递归等式的应用,就看你能不能分解问题写出递归式了)

1.括号化问题。

矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)

2.出栈次序问题。

一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?

类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

3.将多边行划分为三角形问题。

将一个凸N+2多边形区域分成三角形区域的方法数?

类似:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她

从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

4.给顶节点组成二叉树的问题。

给定N个节点,能构成多少种不同的二叉树?

(能构成h(N)个)

Catalan数的解法

Catalan数的组合公式为 Cn=C(2n,n) / (n+1);

此数的递归公式为 h(n ) = h(n-1)*(4*n-2) / (n+1)

卡特兰数真是一个神奇的数字,很多组合问题的数量都和它有关系,例如:

Cn= n对括号正确匹配组成的字符串数,例如 3对括号能够组成:

((())) ()(()) ()()() (())() (()())

Cn= n+1个数相乘,所有的括号方案数。例如, 4个数相乘的括号方案为:

((ab)c)d (a(bc))d (ab)(cd) a((bc)d) a(b(cd))

Cn= 拥有 n+1 个叶子节点的二叉树的数量。例如 4个叶子节点的所有二叉树形态:

Cn=n*n的方格地图中,从一个角到另外一个角,不跨越对角线的路径数,例如, 4×4方格地图中的路径有:

Cn= n+2条边的多边形,能被分割成三角形的方案数,例如 6边型的分割方案有:

Cn= 圆桌周围有 2n个人,他们两两握手,但没有交叉的方案数。

下面是一些大公司的笔试题

先来一道阿里巴巴的笔试题目:说16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱。16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。

C8=1430,所以总数=1430*8!*8!

2012腾讯实习招聘笔试题

在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数?

C3=5;所以总数为5*3!*3!=180.

### 卡特兰的定义 卡特兰是组合学中的一个重要列,常用于解决各种计问题。该列的前几项为:1, 1, 2, 5, 14, 42, ...。卡特兰的一个常见定义是通过递推公式来表示: $$ C(0) = 1 $$ $$ C(n) = \sum_{i=0}^{n-1} C(i) \cdot C(n-i-1) $$ 其中 $ C(n) $ 表示第 $ n $ 个卡特兰[^1]。 --- ### 卡特兰的计算公式 除了递推公式之外,卡特兰还可以通过闭式公式直接计算: $$ C(n) = \frac{1}{n+1} \binom{2n}{n} $$ 这个公式利用了组合 $ \binom{2n}{n} $,并除以 $ n+1 $ 来得到第 $ n $ 个卡特兰。这种形式在编程实现中非常有用,因为它避免了递归带来的重复计算问题。 此外,卡特兰还可以通过以下递推关系进行高效计算: $$ C(n+1) = \frac{2(2n+1)}{n+2} \cdot C(n) $$ 这种方法减少了计算复杂度,适用于大规模据处理。 --- ### 应用场景 卡特兰在计算机科学中有广泛的应用,尤其是在算法设计和据结构领域。以下是几个典型应用场景: #### 括号匹配问题 给定 $ n $ 对括号,合法的括号序列量等于第 $ n $ 个卡特兰。例如,当 $ n=3 $ 时,有 5 种合法的括号排列方式:`((()))`, `(()())`, `(())()`, `()(())`, `()()()`[^3]。 #### 二叉树计 对于具有 $ n $ 个节点的不同形态的二叉树量,也可以用卡特兰来表示。具体来说,$ n $ 个节点可以构成 $ C(n) $ 种不同的二叉树结构[^3]。 #### 栈排序问题 考虑一个栈操作序列,输入序列为 $ 1, 2, ..., n $,求所有可能的输出序列量。这个问题的答案同样由卡特兰给出,即 $ C(n) $ 种不同的合法输出序列[^3]。 --- ### 在计算机科学中的应用 #### 算法设计与动态规划 卡特兰的递推性质使其成为动态规划的经典案例之一。例如,在解决矩阵链乘法或最长公共子序列等问题时,可以通过记忆化技术优化递归调用,从而提高效率。 #### 据结构 在树结构的设计中,卡特兰可以帮助确定不同类型的树(如满二叉树、完全二叉树)的量。这对于分析搜索树的性能以及生成随机测试据具有重要意义。 #### 编译器与语法分析 在编译原理中,卡特兰可用于解析嵌套结构的语法,例如函调用、条件语句等。合法的表达式结构通常对应于特定的卡特兰实例。 #### 组合优化问题 某些组合优化问题(如路径规划、网格行走问题)也可以转化为卡特兰的形式。例如,在二维网格中从左下角走到右上角,且不能越过对角线的所有路径量也与卡特兰相关。 --- ### 示例代码:卡特兰的计算 下面是一个使用 Python 实现卡特兰计算的示例代码: ```python def catalan(n): # 使用递推公式计算卡特兰 if n == 0 or n == 1: return 1 catalan_numbers = [0] * (n + 1) catalan_numbers[0] = 1 catalan_numbers[1] = 1 for i in range(2, n + 1): for j in range(i): catalan_numbers[i] += catalan_numbers[j] * catalan_numbers[i - j - 1] return catalan_numbers[n] # 测试:计算第5个卡特兰 print(catalan(5)) # 输出应为42 ``` 此代码使用动态规划方法计算第 $ n $ 个卡特兰,并存储中间结果以避免重复计算,从而提高效率。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值