卡特兰数的应用,你知道几个?

2024-02-19 14:38
文章标签 应用 几个 卡特兰 知道

本文主要是介绍卡特兰数的应用,你知道几个?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来自:https://blog.csdn.net/zhangmh93425/article/details/44677891

卡特兰递推公式

1. C_n = /frac{1}{n+1}{2n/choose n} = /frac{(2n)!}{(n+1)!/,n!} /quad n/ge 0  

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

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

4. /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}

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

 

卡特兰数的应用

1. 由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}。而对于不满足的序列,必然存在某一个奇数位使a_1 + a_2 + ... + a_k < 0,而且+1的个数恰好比-1的个数少一个,此时我们将前k项中的+1变为-1,将-1变为+1,那么就得到一个有(n+1)个+1和(n-1)个-1的序列,即一个不满足条件的序列对应于一个由n+1个+1和n-1个-1组成的排列。所以 U_n = {2n/choose n + 1}。那么C_n = {2n/choose n} - U_n = {2n/choose n} - {2n/choose n + 1}}}

 

2. 我们可以将应用1变换形式:将-1看成右括号,+1看成左括号,就变成了左括号和右括号各有n个时,合法括号表达式的个数。比如2个左括号和2个右括号组成的合法表达式有C_2 = 2种,是()()和(())。

 

3. 再次转换形式,对于n+1个数连乘,乘法顺序有C_n种,比如三个数连乘a*b*c,n=2,相当于在式子上加括号,有2种乘法顺序,分别是(ab)c和a(bc)。四个数连乘a*b*c*d,n=3,有5种乘法顺序,分别是a(b(cd)),(ab)(cd),((ab)c)d,(a(bc))d和a((bc)d)。同时对于n为3得到合法的括号序列有5个,分别是:((())),()(()),()()(),(())()和(()()),也即与n+1个数连乘的顺序数一一对应关系。

 

4. 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}

 

5. n个非叶节点的满二叉树的形态数(对称后得到的二叉树除非自己本身对称,否则算是不同)

对于满二叉树,实际上就是将应用4中的每个子节点的空儿子上都加上叶子,就形成了对应的满二叉树,那么n个非叶节点形成的满二叉树的形态数即为Cn

 

6. 对于一个n*n的正方形网格,每次只能向右或者向上移动一格,那么从左下角到右上角所有在副对角线右下方的路径总数为C_n

可以将一条水平边记为+1,垂直边记为-1,那么就组成了一个n个+1和n个-1的序列,并且保证前k步中水平边数不小于垂直边数,换句话说前k个元素的和非负。

 

7. 对凸n+2边形进行不同的三角形分割(只连接顶点对形成n个三角形)数为Cn

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

 

9. 对于集合/{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}}。

 

10. 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

 

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

 

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

 

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

如果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},假设最早买不到票的人编号是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}

这篇关于卡特兰数的应用,你知道几个?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/724985

相关文章

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Java中&和&&以及|和||的区别、应用场景和代码示例

《Java中&和&&以及|和||的区别、应用场景和代码示例》:本文主要介绍Java中的逻辑运算符&、&&、|和||的区别,包括它们在布尔和整数类型上的应用,文中通过代码介绍的非常详细,需要的朋友可... 目录前言1. & 和 &&代码示例2. | 和 ||代码示例3. 为什么要使用 & 和 | 而不是总是使

Python循环缓冲区的应用详解

《Python循环缓冲区的应用详解》循环缓冲区是一个线性缓冲区,逻辑上被视为一个循环的结构,本文主要为大家介绍了Python中循环缓冲区的相关应用,有兴趣的小伙伴可以了解一下... 目录什么是循环缓冲区循环缓冲区的结构python中的循环缓冲区实现运行循环缓冲区循环缓冲区的优势应用案例Python中的实现库

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Java逻辑运算符之&&、|| 与&、 |的区别及应用

《Java逻辑运算符之&&、||与&、|的区别及应用》:本文主要介绍Java逻辑运算符之&&、||与&、|的区别及应用的相关资料,分别是&&、||与&、|,并探讨了它们在不同应用场景中... 目录前言一、基本概念与运算符介绍二、短路与与非短路与:&& 与 & 的区别1. &&:短路与(AND)2. &:非短

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav