关于卡特兰数

卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 : 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, ...

计算公式


卡特兰数一般的计算公式:
另类递推公式:C(n)=C(n-1)*((4*n-2)/(n+1));

一般性质


Cn的另一个表达形式为
所以,Cn是一个自然数,这一点在先前的通项公式中并不显而易见。
这个表达形式也是André对前一公式证明的基础。

卡塔兰数满足以下递推关系

它也满足

这提供了一个更快速的方法来计算卡塔兰数。

卡塔兰数的渐近增长为

它的含义是左式除以右式的商趋向于1当n → ∞。(这可以用n!的斯特灵公式来证明。)

所有的奇卡塔兰数Cn都满足n = 2^k − 1。所有其他的卡塔兰数都是偶数。

实际问题的解决说了这么多,那么卡特兰数在实际问题中的应用还是很广泛的,举例如下:

经典问题(六种类似问题):

应用1描述:n对括号有多少种匹配方式?

思路:n对括号相当于有2n个符号,n个左括号、n个右括号,可以设问题的解为f(2n)。第0个符号肯定为左括号,与之匹配的右括号必须为第2i+1字符。因为如果是第2i个字符,那么第0个字符与第2i个字符间包含奇数个字符,而奇数个字符是无法构成匹配的。通过简单分析,f(2n)可以转化如下的递推式 f(2n) = f(0)*f(2n-2) + f(2)*f(2n - 4) + ... + f(2n - 4)*f(2) + f(2n-2)*f(0)。简单解释一下,f(0) * f(2n-2)表示第0个字符与第1个字符匹配,同时剩余字符分成两个部分,一部分为0个字符,另一部分为2n-2个字符,然后对这两部分求解。f(2)*f(2n-4)表示第0个字符与第3个字符匹配,同时剩余字符分成两个部分,一部分为2个字符,另一部分为2n-4个字符。依次类推。假设f(0) = 1,计算一下开始几项,f(2) = 1, f(4) = 2, f(6) = 5。结合递归式,不难发现f(2n) 等于h(n)。

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

思路:可以这样考虑,首先通过括号化,将P分成两个部分,然后分别对两个部分进行括号化。比如分成(a1)×(a2×a3.....×an),然后再对(a1)和(a2×a3.....×an)分别括号化;又如分成(a1×a2)×(a3.....×an),然后再对(a1×a2)和(a3.....×an)括号化。设n个矩阵的括号化方案的种数为f(n),那么问题的解为: f(n) = f(1)*f(n-1) + f(2)*f(n-2) + f(3)*f(n-3) + f(n-1)*f(1)。f(1)*f(n-1)表示分成(a1)×(a2×a3.....×an)两部分,然后分别括号化。计算开始几项,f(1) = 1, f(2) = 1, f(3) = 2, f(4) = 5。结合递归式,不难发现f(n)等于h(n-1)。

应用3描述:一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问 有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?

(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)思路:可以将持5元买票视为进栈,那么持10元买票视为5元的出栈。这个问题就转化成了栈的出栈次序数。由应用三的分析直接得到结果,f(2n) 等于h(n)。

类似:一位大城市的律师在他住所以北n个街区和以东n个街区处工作,每天她走2n个街区去上班。如果他从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

思路:这个与加括号的很相似,进栈操作相当于是左括号,而出栈操作相当于右括号。n个数的进栈次序和出栈次序构成了一个含2n个数字的序列。第0个数字肯定是进栈的数,这个数相应的出栈的数一定是第2i+1个数。因为如果是2i,那么中间包含了奇数个数,这奇数个肯定无法构成进栈出栈序列。设问题的解为f(2n), 那么f(2n) = f(0)*f(2n-2) + f(2)*f(2n-4) + f(2n-2)*f(0)。f(0) * f(2n-2)表示第0个数字进栈后立即出栈,此时这个数字的进栈与出栈间包含的数字个数为0,剩余为2n-2个数。f(2)*f(2n-4)表示第0个数字进栈与出栈间包含了2个数字,相当于1 2  2 1,剩余为2n-4个数字。依次类推。假设f(0) = 1,计算一下开始几项,f(2) = 1, f(4) = 2, f(6) = 5。结合递归式,不难发现f(2n) 等于h(n)。

应用4描述:n个节点构成的二叉树,共有多少种情形?
     

思路:可以这样考虑,根肯定会占用一个结点,那么剩余的n-1个结点可以有如下的分配方式,T(0, n-1),T(1, n-2),...T(n-1, 0),设T(i, j)表示根的左子树含i个结点,右子树含j个结点。 设问题的解为f(n),那么f(n) = f(0)*f(n-1) + f(1)*f(n-2) + .......+ f(n-2)*f(1) + f(n-1)*f(0)。假设f(0) = 1,那么f(1) = 1, f(2) = 2, f(3) = 5。结合递推式,不难发现f(n)等于h(n)。

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

思路:以其中一个点为基点,编号为0,然后按顺时针方向将其他点依次编号。那么与编号为0相连点的编号一定是奇数,否则,这两个编号间含有奇数个点,势必会有个点被孤立,即在一条线段的两侧分别有一个孤立点,从而导致两线段相交。设选中的基点为A,与它连接的点为B,那么A和B将所有点分成两个部分,一部分位于A、B的左边,另一部分位于A、B的右边。然后分别对这两部分求解即可。设问题的解f(n),那么f(n) = f(0)*f(n-2) + f(2)*f(n-4) + f(4)*f(n-6) + ......f(n-4)*f(2) + f(n-2)*f(0)。f(0)*f(n-2)表示编号0的点与编号1的点相连,此时位于它们右边的点的个数为0,而位于它们左边的点为2n-2。依次类推。f(0) = 1, f(2) = 1, f(4) = 2。结合递归式,不难发现f(2n) 等于h(n)。

应用6描述:求一个凸多边形区域划分成三角形区域的方法数?

思路:以凸多边形的一边为基,设这条边的2个顶点为A和B。从剩余顶点中选1个,可以将凸多边形分成三个部分,中间是一个三角形,左右两边分别是两个凸多边形,然后求解左右两个凸多边形。设问题的解f(n),其中n表示顶点数,那么f(n) = f(2)*f(n-1) + f(3)*f(n-2) + ......f(n-2)*f(3) + f(n-1)*f(2)。f(2)*f(n-1)表示三个相邻的顶点构成一个三角形,那么另外两个部分的顶点数分别为2和n-1。设f(2) = 1,那么f(3) = 1, f(4) = 2, f(5) = 5。结合递推式,不难发现f(n) 等于h(n-2)。

排列组合计算问题中的卡塔兰数(Catalan Number)相关推荐

  1. 算法篇:神奇的卡塔兰数Catalan

    这段时间复习数据结构,想起来这神奇的卡塔兰数 1.百科简介 卡塔兰数的来历:卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1 ...

  2. python计算组合数_Python实现的排列组合计算操作示例

    Python实现的排列组合计算操作示例 本文实例讲述了Python实现的排列组合计算操作.分享给大家供大家参考,具体如下: 1. 调用 scipy 计算排列组合的具体数值 >> from ...

  3. C语言实现卡塔兰数catalan(附完整源码)

    实现卡塔兰数catalan 实现卡塔兰数catalan完整源码(定义,实现,main函数测试) 实现卡塔兰数catalan完整源码(定义,实现,main函数测试) #include <stdio ...

  4. 卡特兰数 Catalan number

    卡特兰数 Catalan number 卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 74290 ...

  5. iOS 借助排列组合求赛事投注的注数问题。

    问题:用户选择了5场赛事,每场比赛的赛果有多个(主胜.平.主负等等),若该用户5场比赛的投注结果为[2.1.3.4.2个赛果],过关方式有2串1.3串1.4串1和5串1.那么投注的注数是都少类? 对于 ...

  6. php技术计算字符个数的函数是什么,php计算字符串中的单词数的函数str_word_count()...

    实例 计算字符串 "Hello World!" 中的单词数:<?php echo str_word_count("Hello world!"); ?> ...

  7. 卡特兰数Catalan Number

    Catalan Number满足下列递推公式: N个元素元素进栈,多少种出栈方式 考虑A.B.C.D依次进栈,那么所有的出栈顺序是下列4种情况的并集: 1)A第一个出栈.肯定是A进栈后马上出栈,剩下B ...

  8. 卡特兰数Catalan number的应用

    卡特兰数(Catalan number)的应用 使用场景 计算公式   卡特兰数是一个特殊的数列,基于这个数列,可以找出很多有趣的问题,对于我们学计算机的而言,与这个数列打交道是不可避免了,举一个很经 ...

  9. java编程求卡特兰数_卡特兰数(Catalan Number)

    卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列.该数在计算机专业中比较重要,有一些具体的应用实例.这篇文章主要分三部分: 卡特兰数递归式的含 ...

  10. python读word文档计算字数,Python 实现word count 简单计算源代码中的字符数、词数、行数。...

    1.PSP PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 20 30 · Estimate · 估计这个任务需要多少时间 20 30 Development ...

最新文章

  1. #读书笔记 Android-Activity启动模式
  2. 你必须会的 JDK 动态代理和 CGLIB 动态代理
  3. 异常检测算( OneClassSVM、EllipticEnvelope、IsolationForest、LocalOutlierFactor)法比较,基于四个仿真数据集
  4. C语言指针总结大学霸IT达人
  5. gn fast-gn_GN的完整形式是什么?
  6. 18-mysql-数据类型
  7. ROS学习笔记7(理解ROS服务和参数)
  8. java 文件内容读取到字符串中,从文本文件中将字符串值读取到Java中的Jav...
  9. access怎么查询工龄_电子商务专业怎么样?学什么?前景好吗?
  10. Eclipse配置Hadoop开发环境
  11. 安卓毕业设计- Android计算器
  12. R语言中5种正态性检验的方法
  13. 2015全国硕士研究生计算机考研真题(附答案)
  14. 浏览器如何工作~(转)
  15. SQL优化:Hive---distribute by 防止数据倾斜
  16. 运用百度智能云车型识别API分析具体车型
  17. file:/usr/local/hive/iotmp/89de7dfe-8f26-4a6e-87b4-bacd16c2b2c8/hive_2021-11-05_05-06-07_555_3392062
  18. linux route 刷新_linux route命令反应很慢是什么原因?
  19. leaflet流入迁徙图(canvas技术)(leaflet篇.71)
  20. 项目实训(十三)——FPS游戏射击反馈震屏及UI子弹数量

热门文章

  1. oracle11g 卸载步骤
  2. JSP中EL表达式不起作用
  3. Mysql表设计需要注意的问题
  4. 第一次冲刺个人计划表
  5. IBM服务器诊断面板
  6. Android - Broadcast机制
  7. matlab求最大公约数和最小公倍数
  8. Jexus 配置ssl
  9. XML和实体序列化和反序列化
  10. 如何在MyEclipse 中将工程已经删除的文件恢复过来