关于Catalan(卡特兰)数的定义

Catalan数是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔(1814–1894)命名。
  令h(0)=1,h(1)=1,catalan数满足递归式:
  h(n)= h(0)*h(n-1) + h(1)*h(n-2) +  + h(n-1)h(0) (其中n>=2)
  该递推关系的解为:
  h(n)=C(2n,n)/(n + 1) (n=1,2,3,)

h(n)=C(2n,n)-C(2n,n-1) (n=1,2,3,)

另类递归式:  h(n)=((4*n-2)/(n+1))*h(n-1)

public int getCatalan(int n) {//h(n) = f(0)f(n-1)+f(1)f(n-2)+...f(n-1)f(0) = c(2n,n)/(n+1)int[] f = new int[n+1]; f[0] = f[1] = 1;for(int i = 2;i<=n;i++) {f[i] = 0;for(int j = 0;j<i;j++) f[i] += f[j] * f[i-1-j];}return f[n];
}

关于Catalan(卡特兰)数的理解

一般为计数。一个大问题A,有n个步骤或规模,要解决这个问题,可以采用分治思想,首先固定其中某一个步骤,将剩下n-1个步骤拆分为两个两个小问题,对应于不同的固定步骤,两个小问题的规模分别为(0,n-1)(1,n-2)...(n-2,1)(n-1,0)。

有序列a1,a2,a3,…a2n-1,a2n(ak=1或-1,k=1,2,3…2n),若对于任何子序列和Sk=a1+a2+a3+…+ak>=0,则称其为Catalan number,Cn

关于Catalan(卡特兰)数的应用

参考图书:

How to Count: An Introduction to Combinatorics, Second Edition

作者:R.B.J.T. Allenby,Alan Slomson

h(n)= h(0)*h(n-1) + h(1)*h(n-2) +  + h(n-1)h(0)

http://blog.csdn.net/wuzhekai1985/article/details/6764858

应用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,有多少个不同的出栈序列?

思路:这个与加括号的很相似,进栈操作相当于是左括号,而出栈操作相当于右括号。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)

      应用7描述:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?

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

Posts Tagged 【Catalan】相关推荐

  1. 【Part2】用JS写一个Blog (node + vue + mongoDB)

    [Part1]用JS写一个Blog (node + vue + mongoDB) 上一节前后端项目分别初始化完成,这一小节我就从后端项目开始写.实现mongoDB数据库的连接. 整理后端目录 下面是通 ...

  2. 【干货】史上最全的Tensorflow学习资源汇总,速藏!

    一 .Tensorflow教程资源: 1)适合初学者的Tensorflow教程和代码示例:(https://github.com/aymericdamien/TensorFlow-Examples)该 ...

  3. Javascript中的陷阱大集合【译】

    参考:http://www.2cto.com/kf/201111/111203.html 昨天晚上在自己的个人技术博客上翻译了一篇有关Javascript的文章,今天想想还是把它投稿到博客园吧,大家可 ...

  4. 【翻译】QEMU内部机制:顶层概览

    系列文章: [翻译]QEMU内部机制:宏观架构和线程模型 [翻译]QEMU内部机制:vhost的架构 [翻译]QEMU内部机制:顶层概览(本文) [翻译]QEMU内部机制:内存 原文地址:http:/ ...

  5. 【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )

    文章目录 一.EventBus 中主线程支持类 二.EventBus 中 AsyncPoster 分析 三.AsyncPoster 线程池 Runnable 任务类 一.EventBus 中主线程支持 ...

  6. 我的VIM配置及说明【K-VIM】

    我的VIM配置及说明[K-VIM] 我的vim配置及说明[k-vim] vim插件分类及快捷键 vim基本用法 使用说明 配置步骤 其他 截图 自定义快捷键说明 插件及其快捷键说明 gmarik/vu ...

  7. 【NLP】 NLP中应用最广泛的特征抽取模型-LSTM

    本篇介绍在NLP中应用最为广泛的特征抽取模型LSTM.详细介绍LSTM提出的由来及其模型结构,并由此分析了LSTM能够解决RNN不能够对长序列进行处理和训练的原因. 作者&编辑 | 小Drea ...

  8. 【Linux】一步一步学Linux——nm命令(250)

    00. 目录 文章目录 00. 目录 01. 命令概述 02. 命令格式 03. 常用选项 04. 参考示例 05. 附录 01. 命令概述 nm命令被用于显示二进制目标文件的符号表. 02. 命令格 ...

  9. 【caffe-matlab】权重以及特征图的可视化

    前言 移植了各种caffe,是时候进行下一步操作了,先拿可视化下手吧.大部分内容可能跟网上的方法不一样,大家看完我的博客最好去网上看看大牛们的博客,万一被我误导了,就罪过了o(╯□╰)o,开更.... ...

最新文章

  1. operator new和operator delete
  2. 乔安监控云存储_智能运维丨全栈监控,护航云上业务
  3. yolov4Linux,基于Darknet的YOLOv4目标检测
  4. NSString 中包含中文字符时转换为NSURL
  5. devops流程工具_您的DevOps工作流程依赖哪些工具?
  6. GitHub上传文件不能超过100M的解决办法
  7. Net4.0—VS2010新特性
  8. vs code编辑php时,突然显示红色波浪线的错误提示的解决方案
  9. matlab调用C语言
  10. 浅谈红帽认证RHCE 8.0学习与考试
  11. CREO:CREO软件之装配设计界面的简介、装配图设计流程、常见方法(主控件TOP DOWN设计、骨架模型TOP DOWN设计、记事本模型设计)、案例应用(图文教程)之详细攻略
  12. EditPlus4.0汉化+破解注册
  13. 秦偲洺 荣获 火星少年计划 第三季 全球线上评选人气奖
  14. Python中CRAPS游戏,即花旗骰
  15. 【5GC】三种SSC(Session and Service Continuity)模式介绍
  16. 支付宝微信个人收款支付系统解决方案
  17. 基于图书管理系统的需求分析之威胁建模
  18. # DZY Love Math 系列
  19. recon靶机实验实战演练
  20. 「斐讯」N1-YYF 固件

热门文章

  1. Linux上使用ZFS
  2. 算法笔记之回溯法(一)——溯洄从之,道阻且长;溯游从之,宛在水中央。
  3. stomp与veil用法
  4. 光纤模式分布 matlab,matlab计算单模光纤模式分布(公布源代码及参考文献)
  5. np.repeat函数
  6. 微信小程序如何使用解析 nbsp; lt; gt; amp; apos; ensp; emsp;等字符?
  7. Vigenere密码加密解密原理
  8. ubuntu修改用户名和home对应的目录名
  9. python人工智能框架有哪些_10个最佳的人工智能开发框架和AI库
  10. linux 参数解析,Linux 命令行参数解析