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

卡特兰数递归式的含义解释

卡特兰数表达式的证明过程

卡特兰数的计算机中的应用

Catalan Number递归式解释

假设h(0)=1,h(1)=1,catalan数满足递推式:

\[h(n) = h(0)*h(n-1) + h(1)*h(n-2) + h(2)*h(n-3) + ... +h(n-1)*h(0) \tag{1.1}

\]

递归式背后有什么物理含义呢,这里以出栈序列问题进行说明:

问题描述:一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?

含义解释:首先,我们设\(h(n)\)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则,由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有\(h(k-1)\)种,而之后比k大的值入栈,且都在k之前出栈,因此有\(h(n-k)\)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,\(h(n-k)*h(k-1)\)种,求和便是Catalan递归式。

Catalan Number表达式证明

第n个卡特兰数h(n)表达式如下

\[h(n)=\frac{C_{2n}^{n}}{n+1}=C_{2n}^{n}-C_{2n}^{n-1} \tag{1.2}

\]

具体证明过程如下

为了便于编程实现,需要进一步推导h(n)与h(n-1)之间的关系

已知\(h(n)\),易知

\[h(n-1)=\frac{C_{2n-2}^{n-1}}{n}

\]

推导\(h(n)\)的\(C_{2n}^{n}\)和\(h(n-1)\)的\(C_{2n-2}^{n-1}\)之间的关系,由\(kC_{n}^{k}=nC_{n-1}^{k-1}\)知

\[\begin{align}

n*C_{2n}^{n}&=2nC_{2n-1}^{n-1} \\

C_{2n}^{n}&=2C_{2n-1}^{n-1} \\

C_{2n}^{n}&=2\frac{(2n-1)C_{2n-2}^{n-1}}{n} \\

C_{2n}^{n}&=2(2n-1)h(n-1) \\

\frac{C_{2n}^{n}}{n+1}&=\frac{2(2n-1)}{n+1}h(n-1) \\

h(n)&=\frac{2(2n-1)}{n+1}h(n-1)

\end{align}

\]

最终得到\(h(n)\)和\(h(n-1)\)之间的递归式\(h(n)=\frac{2(2n-1)}{n+1}h(n-1)\)

Catalan Number应用实例

括号匹配问题

问题描述:矩阵连乘 \(P=A_1A_2...A_n\),依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,问有几种括号化的方案?

问题转换一下就是n对括号的正确匹配方案,可以做一下LeetCode-22

出栈次序问题

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

出栈问题问题正是卡特兰数递归式\(h(n)=h(0)h(n-1)+h(1)h(n-2)+...+h(n-1)h(0)\)的由来

相关应用问题

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

n个1和n个0组成一个2n位的二进制数,要求从左到右扫描,0的累计数不小于1的累计数,求满足条件的的数。

12个人排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排。对问题进行转化:用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,并且任意前缀中0的个数大于等于1的个数就对应一种方案,转化后的问题就是问题2了。

给定节点组成二叉树的问题:给定n个节点,能构成多少种形状不同的二叉树?

先取一个点作为顶点,然后左边依次可以取0至n-1个相对应的,右边是n-1到0个,两两配对相乘,就是\(h(0)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(0)=h(n)\)能构成\(h(n)\)个,因此二叉树问题也可以解释卡特兰数递归式(1.1)式的由来

n*n棋盘从左下角走到右上角而不穿过主对角线的走法?

要从左下角走到右上角则必须向上走n步,向右n步,同时为了不跨过主对角线,则走过的步数中向上走的步数必须大于等于向右走的步数,剖析之后发现这个问题与问题3是等价问题,走法有卡特兰数\(h(n)\)种。

可以做一下下面两题练练手:

n个+1和n个-1构成的2n项序列,其部分和总满足:\(a_1+a_2+...+a_n>=0\)的序列的个数。

卡特兰数表达式(1.2)式就是以该问题模型为基础推导出来的

参考链接:

java编程求卡特兰数_卡特兰数(Catalan Number)相关推荐

  1. c语言编程所得票数,C语言编程求1X2X3····Xn所得的数末尾有多少个零

    C语言编程求1X2X3····Xn所得的数末尾有多少个零 发布时间:2020-08-10 02:23:57 来源:51CTO 阅读:312 作者:sonissa 参见大数的阶乘 https://blo ...

  2. JAVA编程习题及答案_完美版

    JAVA编程习题及答案_完美版 原创 lingwu7 最后发布于2017-08-15 20:01:12 阅读数 10796 收藏 发布于2017-08-15 20:01:12 版权声明:本文为博主原创 ...

  3. Java递归求斐波那契数求猴子吃桃

    递归求斐波那契数 斐波那契数是指前两位是1,后面的数依次是其前两位的和.即1,1,2,3,5,8-给你一个 n,求其值是多少 public class recursionExercise01{//定义 ...

  4. java 编程求图形面积_求java编程,计算长方形面积?

    求java编程,计算长方形面积? mip版  关注:195  答案:2  悬赏:0 解决时间 2021-01-28 06:47 已解决 2021-01-27 08:26 求java编程,计算长方形面积 ...

  5. java编程控制电脑硬件_如何快速学习AP计算机中的Java编程?

    AP Computer Science A (APCSA)考试,需要掌握Java编程语言.对于刚学习Java的同学,都应该了解Java编程语言的知识体系结构. 多编程零基础的高中生,在自学一段时间内, ...

  6. java编程能做什么_学习Java编程能做什么工作?

    Java作为编程语言界最时髦流行的元老之一,现今在软件市场上也是宠儿,被各大企业广泛应用到生产中.在各种行业.各个企业的业务管理平台,如门户网站等许多方面都占据了主导地位.吸引着越来越多学习Java的 ...

  7. 想学java编程从哪入手_初学编程从哪方面入手?

    感谢邀请! 从最初的机器语言到汇编语言,再到百花齐放的高级语言,编程语言种类繁多,多达上百种.当然每一种语言都有自己特殊的用途.例如,java,php专门用来显示网页:Perl更适合文本处理:C语言被 ...

  8. 丰沛数_不足数_完全数

    因数的和比数字本身大的数称为丰沛数. 因数的和比数字本身小的数称为不足数. 完全数是一个整数:其因数之和(不含本身打因素)加起来就是数字本身. 1 theNum = int(raw_input('Pl ...

  9. 自学个JAVA编程有什么用_怎样自学java编程

    4 怎么学java 多线程需要理解机理 很多Java程序员热衷于多线程程序编写,认为是对逻辑能力的挑战.其实在大量应用中根本就不需要编写多线程程序,或者说大多数编写应用程序的程序员不会去写多线程程序. ...

最新文章

  1. C++程序设计(第二版)谭浩强----程序题课后习题答案第二章
  2. winsock 函数声明大全
  3. login窗口for mysql_CTF| SQL注入之login界面
  4. 玩转oracle 11g(24):数据文件设置自扩展和监听日志文件过大处理
  5. bsp的分析(其中使用buildroot文件夹建立rootfs)
  6. CLOUD信用管理设置
  7. sdk linux 离线安装方法,Android SDK离线安装方法详解(加速安装)
  8. 300. 最长递增子序列(JavaScript)
  9. 10种提高WordPress访问速度的方法
  10. Java观察者模式例子
  11. php网页代码字体大小,HTML网页字体大小的设置
  12. upgrade-insecure-requests
  13. linux 解压 7z 分卷压缩文件,linux分卷压缩与解压缩
  14. 人生进度条百分之20_1分钟get技能:缺了“进度条”,你注定和80%的失败者一样实现不了人生目标...
  15. HTTP和MQTT协议实践
  16. lintcode---电话号码的字母组合
  17. peek用法解决多读一行
  18. live555 android,live555
  19. 硅谷最凶猛的云计算“独角兽”:Snowflake造富神话 能否在中国复制?| 硅谷速递...
  20. 流言终结者 1080P全高清都等于高画质?

热门文章

  1. html遍历json数组,JS遍历JSON数组及获取JSON数组长度操作示例【测试可用】
  2. 基于 LBP + SVM 胡萝卜开裂检测算法
  3. linux find tar -type 备份日志!!
  4. 给定经纬度计算距离_通过经纬度坐标计算距离的方法(经纬度距离计算)ZZ
  5. django外键获取数据
  6. linux kdump
  7. 品牌推广技巧有哪些?星媒志分析企业怎么样做线上品牌推广
  8. 高温来袭?通过python爬虫爬取天气预警信息
  9. 微信小程序 仿京东 省市县地址选择
  10. `英语` 2022/8/20