`
Coco_young
  • 浏览: 125781 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

卡特兰数

 
阅读更多
什么是Catalan数

说到Catalan数,就不得不提及Catalan序列,Catalan序列是一个整数序列,其通项公式是C_n = /frac{1}{n+1}{2n/choose n} = /frac{(2n)!}{(n+1)!/,n!} /quad n/ge 0我们从中取出的C_n就叫做第n个Catalan数,前几个Catalan数是:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, …咋看之下没什么特别的,但是Catalan数却是许多计数问题的最终形式。

Catalan数的一些性质

Catalan数的基本公式就是上个部分所列出的那样,但是却有一些变形和具体的性质:

1、C_n = {2n/choose n} - {2n/choose n+1} /quad n/ge 0

这是根据原来的式子推导出来的,大概过程是这样的:C_n = /frac{1}{n+1}{2n/choose n} = {2n/choose n} -  /frac{n}{n+1}{2n/choose n} = {2n/choose n} -  {2n/choose n + 1}

2、C_0 = 1 /quad , /quad C_{n+1}=/frac{2(2n+1)}{n+2}C_n

这个递推式很容易可以从原来的式子中获得

3、/begin{displaymath}C_0 = 1 /quad , /quad C_{n+1}=/sum_{i=0}^{n}C_i/,C_{n-i}/quad n/ge 0/end{displaymath}

4、/begin{displaymath}C_n= /frac 1{n+1} /sum_{i=0}^n {n /choose i}^2/end{displaymath}

5、/begin{displaymath}C_n /sim /frac{4^n}{n^{/frac{3}{2}}/sqrt{/pi}}/end{displaymath}

这个是Catalan数的增长趋势。

Catalan数在组合计算中的应用

在《组合数学》(机械工业出版社)一书中,介绍Catalan数是由其一个应用推导出的公式,其具体的描述如下:

n个+1和n个-1构成2n项a_1,a_2,...,a_n,其部分和满足a_1 + a_2 + ... + a_k /ge 0 /quad , /quad 0 /le k /le 2n的序列个数等于第n个Catalan数C_n

其证明也不难,我们假设不满足条件的序列个数为U_n,那么就有C_n + U_n = {2n /choose n}。剩下的工作就是求U_n了,我们假设有一个最小的k令a_1 + a_2 + ... + a_k < 0。由于这里k是最小的,所以必有a_1 + a_2 + ... + a_{k - 1} = 0 /quad , /quad a_k = -1,并且k是一个奇数。此时我们将前k项中的+1变为-1,将-1变为+1,那么就得到一个有(n+1)个+1和(n-1)个-1的序列了,这样的序列个数就是我们要求的U_n,数值大小为U_n = {2n/choose n + 1}。那么我们就得到了C_n = {2n/choose n} - U_n = {2n/choose n} - {2n/choose n + 1}}},就是我们前面的公式。

在具体的组合数问题中,很多都可以转换为Catalan数进行最后的计算,如下:

1、如上文所说,对于任意的k,前k个元素中-1的个数小等于+1的个数的序列计数,我们可以不停地变换形式,比如将-1看成右括号,+1看成左括号,就变成了合法括号表达式的个数。比如2个左括号和2个右括号组成的合法表达式有C_2 = 2种,是()()和(())。

2、既然如上一点都把括号加上去了,那么顺便就再次转换,n+1个数连乘,乘法顺序有C_n种,比如我们三个数连乘a*b*c,那么等于在式子上加括号,有2种乘法顺序,分别是(ab)c和a(bc)。貌似对应关系比较模糊,我们取n为3来看看,n为3的时候就是4个数相乘了,那么我们设为abcd,最初的标号定在a上,我们对于n为3得到合法的括号序列有5个,分别是:((())),()(()),()()(),(())()和(()()),那么我们将一个左括号看成是当前操作数指针往右移动一个位置,一个右括号看成是当前操作数和左边最近的一块操作数相乘起来,那么对应的五个表达式就是:a(b(cd)),(ab)(cd),((ab)c)d,(a(bc))d和a((bc)d),他们之间是一一对应关系。

3、n个节点的二叉树的所有可能形态数为C_n,这一点很容易证明,我们考虑随便取一个节点作为根,那么他左边和右边的儿子节点个数就确定了,假定根节点标号为x,那么左子树的标号就从1到x-1,共x-1个,右子树的标号就从x+1到n,共n-x个,那么我们的x从1取到n,就获得了所有的情况数/begin{displaymath}C_n = /sum_{i = 0}^{n - 1}C_i/,C_{n - i - 1}/end{displaymath}。这个式子就是我们性质3的式子。

4、n个非叶节点的满二叉树的形态数(对称后得到的二叉树除非自己本身对称,否则算是不同),这里取Wikipedia上的一张图片说明问题:

这里要求满二叉树,实际上就是在上一点的每个子节点的空儿子上都加上叶子,就形成了我们的图了,那么我们要求的结果就是Catalan数。

5、对于一个n*n的正方形网格,每次我们能向右或者向上移动一格,那么从左下角到右上角的所有在副对角线右下方的路径总数为C_n。同样引用Wikipedia上的一张图片来表示:

我们将一条水平边记为+1,垂直边记为-1,那么就组成了一个n个+1和n个-1的序列,我们所要保证的就是前k步中水平边的个数不小于垂直边的个数,换句话说前k个元素的和非负,就是我们关于Catalan数的定义。

6、凸n+2边形进行三角形分割(只连接顶点对形成n个三角形)数:

7、n个数入栈后的出栈的排列总数是C_n。例如1,2,3入栈的出栈排序有123,132,213,231和321五种

8、对于集合/{1,2,...,2n/}的不交叉划分的数目为C_n,这里解释一下不交叉划分,我们对于集合{a,b}和{c,d},假设他们组成了两个区间[a,b]和[c,d],我们假设两个区间不重合,那么以下四种情况当做是不交叉的:a<c<d<b,a<b<c<d,c<a<b<d与c<d<a<b,就是说两个区间可以包含或者相离,那么此时我们称集合{a,b}和{c,d}是不交叉的。对于集合/{1,2,...,2n/},将里面元素两两分为一子集,共n个,若任意两个子集都是不交叉的,那么我们称此时的这个划分为一个不交叉划分。此时不交叉的划分数就是我们的C_n了,证明也很容易,我们将每个子集中较小的数用左括号代替,较大的用右括号代替,那么带入原来的1至2n的序列中就形成了合法括号问题,就是我们第二点的结论。例如我们的集合{1,2,3,4,5,6}的不交叉划分有五个:{{1,2},{3,4},{5,6}},{{1,2},{3,6},{4,5}},{{1,4},{2,3},{5,6}},{{1,6},{2,3},{4,5}}和{{1,6},{2,5},{3,4}}。

9、n层的阶梯切割为n个矩形的切法数也是C_n。如下图所示:

这个证明是怎么进行的呢?我们先绘制如下的一张图片,即n为5的时候的阶梯:

我们注意到每个切割出来的矩形都必需包括一块标示为*的小正方形,那么我们此时枚举每个*与#标示的两角作为矩形,剩下的两个小阶梯就是我们的两个更小的子问题了,于是我们的C_5 = C_0 * C_4 + C_1 * C_3 + C_2 * C_2 + C_1 * C_3 + C_0 * C_4注意到这里的式子就是我们前面的性质3,因此这就是我们所求的结果了。

10、在一个2*n的格子中填入1到2n这些数值使得每个格子内的数值都比其右边和上边的所有数值都小的情况数也是C_n

11、平面上连接可以形成凸包的2n个点分成2个一组连成n条线段,两两线段之间不相交的情况总数是C_n,这里实际上和第7点本质上是一样的,这里就不解释了。

Catalan数问题的一个变形:

n+m个人排队买票,并且满足n /ge m,票价为50元,其中n个人各手持一张50元钞票,m个人各手持一张100元钞票,除此之外大家身上没有任何其他的钱币,并且初始时候售票窗口没有钱,问有多少种排队的情况数能够让大家都买到票。

这个题目是Catalan数的变形,不考虑人与人的差异,如果m=n的话那么就是我们初始的Catalan数问题,也就是将手持50元的人看成是+1,手持100元的人看成是-1,任前k个数值的和都非负的序列数。

这个题目区别就在于n>m的情况,此时我们仍然可以用原先的证明方法考虑,假设我们要的情况数是D_{n+m},无法让每个人都买到的情况数是U_{n + m},那么就有D_{n + m} + U_{n +m} = {n + m /choose n},此时我们求U_{n + m},我们假设最早买不到票的人编号是k,他手持的是100元并且售票处没有钱,那么将前k个人的钱从50元变成100元,从100元变成50元,这时候就有n+1个人手持50元,m-1个手持100元的,所以就得到U_{n + m} = {n + m /choose n + 1},于是我们的结果就因此得到了,表达式是D_{n + m} = {n + m /choose n} - {n + m /choose n + 1}

关于Catalan数的变形还有很多,本身组合数学就是一门十分有趣的学科,通过不停地分析,求解我们能够不断增加自己思维的严谨性和全面性。

分享到:
评论

相关推荐

    卡特兰数(Catalan)

    卡特兰数(Catalan Number)是一种在数学中广泛应用的组合数,特别是在组合几何、图论、语言学和计算理论等领域。这个数列的名字来源于比利时数学家欧仁·查尔斯·卡特兰(Eugène Charles Catalan)。卡特兰数具有...

    出栈序列和卡特兰数

    "出栈序列和卡特兰数" 出栈序列是栈的一种常见操作,给定 n 个元素,统计可能的出栈序列的个数是一个经典的问题。卡特兰数是一个常出现在各种计数问题中的数列,是组合数学中的一个重要概念。 栈是一种常见的数据...

    特殊数系列之卡特兰数

    特殊的数系列之卡特兰数(Catalan) 1.括号化问题。矩阵链乘: P=A1×A2×A3×……×An,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案? 2.将多边行划分为三角形问题。将一个凸...

    卡特兰数字

    卡特兰数(Catalan Numbers)是一组在数学中广泛应用的整数序列,它们以比利时数学家欧仁·查尔斯·卡特兰的名字命名。这个序列在许多不同的数学问题和组合问题中出现,包括括号匹配、二叉树、分割问题、格点路径等...

    卡特兰数各种算法.rar

    卡特兰数(Catalan Number)是一种在数学中广泛应用的整数序列,它首次由比利时数学家欧仁·查尔斯·卡特兰提出。这个序列在许多不同的数学问题中出现,包括组合学、图论、语法分析、计算几何等领域。在算法设计中,...

    运用C语言实现每一位的卡特兰数计算(源码)

    卡特兰数(Catalan number)是组合数学中的一个数列,以法国数学家欧仁·查尔斯·卡特兰(Eugène Charles Catalan)的名字命名。卡特兰数通常用于描述许多组合结构的数量,如合法的括号序列、二叉树、凸多边形的...

    C#,卡特兰数(Catalan number,明安图数)的算法源代码

    卡特兰数(英语:Catalan number),又称卡塔兰数、明安图数,是组合数学中一种常出现于各种计数问题中的数列。以比利时的数学家欧仁·查理·卡特兰的名字来命名。1730年左右被蒙古族数学家明安图使用于对三角函数幂...

    ACM模板 卡特兰数和博弈论

    ### ACM模板:卡特兰数和博弈论 #### 一、概述 在计算机科学与算法竞赛领域中,博弈论和组合数学是两个重要的分支。博弈论主要研究的是两个或多个参与者之间的策略选择问题,而组合数学则侧重于研究离散结构的性质...

    为什么n个节点的二叉树是卡特兰数

    刚刚接触卡特兰数的时候,对这个结论很蒙,因为左右括号、火车进站很好理解,结果是个2*n的序列,与卡特兰数的证明可以直接对应。但是对于二叉树,我却很难想到怎么构造成2*n个数的数列。 可以把二叉树转换成完全...

    深入理解卡特兰数及其应用

    Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。 令h(0)=1,h(1)=1,catalan数满足递推式:h(n)= h(0)*h(n-1)+h...

    python圣诞树代码动态3d-25.栈-卡特兰数(正经一次).py

    python圣诞树代码动态3d-25.栈——卡特兰数(正经一次).py

    吉林大学软件学院组合数学课程报告

    卡特兰数(Catalan Number)是组合数学中应用广泛的重要计数函数,以比利时的数学家欧仁·查理·卡塔兰(1814–1894)的名字来命名,其前几项为(从第零项开始):1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,...

    警告,本文有很多卡网的latex,请三思,康托产开、卡特兰数、prufer_序列、基本计数原理、排列_Math.zip

    警告,本文有很多卡网的latex,请三思,康托产开、卡特兰数、prufer_序列、基本计数原理、排列_Math

    卡特兰数(Catalan)应用:输出所有N对合法括号序列和输出所有已知进栈序列的合法出栈序列

    Catalan应用 输出所有N对合法括号序列 输出所有已知进栈序列的合法出栈序列 http://blog.csdn.net/ssuchange/article/details/17394609

    组合数学- 卡特兰数列(Catalan).rar

    这个公式表示第n项卡特兰数是前n-1项卡特兰数对的和,每一对的第一个和第二个数相乘后除以n+1。 卡特兰数列在许多不同的组合问题中扮演着核心角色,比如: 1. **括号序列**:卡特兰数列可以用来计算正确的无括号...

    吉林大学组合数学期末报告

    【组合数学】是一门研究离散结构中计数方法的数学分支,而【卡特兰数】是其中的一个核心概念,常用于解决多种计数问题。卡特兰数以其独特的递推关系和丰富的几何、组合解释,成为了组合数学中极具代表性的数列。 **...

    母函数的运用

    ### 母函数在求解卡特兰数中的应用 #### 一、母函数与卡特兰数的基础概念 在组合数学中,**母函数**是一种用来表示序列的方法,通过构造一个函数使得该函数的系数对应原序列的值。利用母函数可以非常方便地解决...

    信奥中的数学 组合篇 相关资料汇总.pdf

    信奥中的数学组合篇相关资料汇总.pdf 是一份关于信奥中的数学组合篇的资料汇总,涵盖了组合数学、斯特林数、卡特兰数、母函数、Burnside 引理与 Polya 原理、莫比乌斯变换、平衡规划、双端栈、双端队列、等价类等...

    凸多边形三角划分

    "凸多边形三角划分"是一个在计算机图形学领域中常见的问题,特别是在三维建模、游戏开发和物理模拟等场景中。这个问题的目标是将一个凸多边形分割成多个不相交的三角形,这些三角形能够无间隙地覆盖整个多边形。...

Global site tag (gtag.js) - Google Analytics