文章目录

  • 基本概念
    • 介绍
    • 定义
  • 实际问题
    • 例题1
    • 方法
    • 01序列
    • 括号匹配
    • 进出栈问题
    • 312排列
    • 不相交弦问题
    • 二叉树的构成问题
    • 凸多边形的三角划分
    • 阶梯的矩形划分

也许更好的阅读体验

基本概念

介绍

学卡特兰数我觉得可能比组合数要难一点,因为组合数可以很明确的告诉你那个公式是在干什么,而卡特兰数却像是在用大量例子来解释什么时卡特兰数
这里,我对卡特兰数做一点自己的理解
卡特兰数是一个在组合数学里经常出现的一个数列,它并没有一个具体的意义,却是一个十分常见的数学规律

对卡特兰数的初步理解:有一些操作,这些操作有着一定的限制,如一种操作数不能超过另外一种操作数,或者两种操作不能有交集等,这些操作的合法操作顺序的数量

为了区分组合数,这里用fnf_nfn​表示卡特兰数的第nnn项
从零开始,卡特兰数的前几项为1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790…1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790\ldots1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790…

定义

递归定义

fn=f0∗fn−1+f1∗fn−2+…+fn−1f0f_n=f_0*f_{n-1}+f_1*f{n-2}+\ldots+f_{n-1}f_{0}fn​=f0​∗fn−1​+f1​∗fn−2+…+fn−1​f0​,其中n≥2n\geq 2n≥2

递推关系

fn=4n−2n+1fn−1f_n=\frac{4n-2}{n+1}f_{n-1}fn​=n+14n−2​fn−1​

通项公式

fn=1n+1C2nnf_n=\frac{1}{n+1}C_{2n}^{n}fn​=n+11​C2nn​

经化简后可得

fn=C2nn−C2nn−1f_n=C_{2n}^{n}-C_{2n}^{n-1}fn​=C2nn​−C2nn−1​

只要我们在解决问题时得到了上面的一个关系,那么你就已经解决了这个问题,因为他们都是卡特兰数列


实际问题

先用一个最经典的问题来帮助理解卡特兰数
去掉了所有的掩饰,将问题直接写出来就是

例题1

在一个w×hw\times hw×h的网格上,你最开始在(0,0)\left(0,0\right)(0,0)上,你每个单位时间可以向上走一格,或者向右走一格,在任意一个时刻,你往右走的次数都不能少于往上走的次数,问走到(n,n),0≤n\left(n,n\right),0\leq n(n,n),0≤n有多少种不同的合法路径。

合法路径个数为C2nn−C2nn−1C_{2n}^{n}-C_{2n}^{n-1}C2nn​−C2nn−1​

直接求不好,考虑求有多少种不合法路径
路径总数为在2n2n2n次移动中选nnn次向上移动,即C2nnC_{2n}^{n}C2nn​

画一下图,我们把y=x+1y=x+1y=x+1这条线画出来,发现所有的合法路径都是不能碰到这条线的,碰到即说明是一条不合法路径
先随便画一条碰到这条线的不合法路径,所有的不合法路径都会与这条线有至少一个交点,我们把第一个交点设为(a,a+1)\left(a,a+1\right)(a,a+1)
如图

我们把(a,a+1)\left(a,a+1\right)(a,a+1)之后的路径全部按照y=x+1y=x+1y=x+1这条线对称过去
这样,最后的终点就会变成(n−1,n+1)\left(n-1,n+1\right)(n−1,n+1)

由于所有的不合法路径一定会与y=x+1y=x+1y=x+1有这么一个交点
我们可以得出,所有不合法路径对称后都唯一对应着一条到(n−1,n+1)\left(n-1,n+1\right)(n−1,n+1)的路径
且所有到(n−1,n+1)\left(n-1,n+1\right)(n−1,n+1)的一条路径都唯一对应着一条不合法路径(只需将其对称回去即可)
所以不合法路径总数是C2nn−1C_{2n}^{n-1}C2nn−1​

那么合法的路径总数为C2nn−C2nn−1C_{2n}^{n}-C_{2n}^{n-1}C2nn​−C2nn−1​

这是一个非常好用且重要的一个方法,其它的问题也可以用该方法解决
找到不合法路径唯一对应的到另一个点的路径
如网格计数


方法

先将方法写在前面吧
相信大家都听过烧开水这个数学小故事吧
和学习数学一样,转化是基本思路,将一个问题转化为另外一个已经解决了的问题是最重要的


01序列

你现在有nnn个000和nnn个111,问有多少个长度为2n2n2n的序列,使得序列的任意一个前缀中111的个数都大于等于000的个数
例如n=2n=2n=2时
有1100,10101100,10101100,1010两种合法序列
而1001,0101,0110,00111001,0101,0110,00111001,0101,0110,0011都是不合法的序列

合法的序列个数为C2nn−C2nn−1C_{2n}^{n}-C_{2n}^{n-1}C2nn​−C2nn−1​

我们把出现一个111看做向右走一格,出现一个111看做向上走一格,那么这个问题就和上面的例题111一模一样了

拓展
如果是nnn个1,m1,m1,m个000呢?
不过是最后的终点变为了(n,m)\left(n,m\right)(n,m)罢了
如果是111的个数不能够比mmm少kkk呢
我们只需将y=x+1y=x+1y=x+1这条线上下移动即可


括号匹配

你有nnn个左括号,nnn个右括号,问有多少个长度为2n2n2n的括号序列使得所有的括号都是合法的

合法的序列个数为C2nn−C2nn−1C_{2n}^{n}-C_{2n}^{n-1}C2nn​−C2nn−1​

要使所有的括号合法,实际上就是在每一个前缀中左括号的数量都不少于右括号的数量
将左括号看做111,右括号看做000,这题又和上面那题一模一样了


进出栈问题

有一个栈,我们有2n2n2n次操作,nnn次进栈,nnn次出栈,问有多少中合法的进出栈序列

合法的序列个数为C2nn−C2nn−1C_{2n}^{n}-C_{2n}^{n-1}C2nn​−C2nn−1​

要使序列合法,在任何一个前缀中进栈次数都不能少于出栈次数…\ldots…
后面就不用我说了吧,和上面的问题又是一模一样的了


312排列

一个长度为nnn的排列aaa,只要满足i<j<ki<j<ki<j<k且aj<ak<aia_j<a_k<a_iaj​<ak​<ai​就称这个排列为312312312排列
求nnn的全排列中不是312312312排列的排列个数

答案也是卡特兰数

我们考虑312312312排列有什么样的特征
如果考虑一个排列能否被1,2,3,…,n−1,n1,2,3,\ldots,n-1,n1,2,3,…,n−1,n排列用进栈出栈来表示
那么312312312排列就是所有不能被表示出来的排列
那么这个问题就被转化成进出栈问题了


不相交弦问题

在一个圆周上分布着 2n2n2n个点,两两配对,并在这两个点之间连一条弦,要求所得的2n2n2n条弦彼此不相交的配对方案数
当n=4n=4n=4时,一种合法的配对方案为如图

合法的序列个数为C2nn−C2nn−1C_{2n}^{n}-C_{2n}^{n-1}C2nn​−C2nn−1​

这个问题没有上面的问题那么显然,我们规定一个点为初始点,然后规定一个方向为正方向
如规定最上面那个点为初始点,逆时针方向为正方向
然后我们把一个匹配第一次遇到的点(称为起点)旁边写一个左括号(((,一个匹配第二次遇到的点(称为终点)旁边写一个右括号)))
如图

看出来吗,在规定了这样的一个顺序后,在任意一个前缀中起点的个数都不能少于终点的个数
于是这又是一个卡特兰数列了


二叉树的构成问题

有nnn个点,问用这nnn个点最终能构成多少二叉树

答案仍然是卡特兰数列

这个问题不是用上面的方法,是用递归定义的卡特兰数

一个二叉树分为根节点,左子树,右子树
其中左子树和右子树也是二叉树,左右子树节点个数加起来等于n−1n-1n−1
设iii个点能构成fif_ifi​个二叉树
我们枚举左子树有几个点可得
fn=f0∗fn−1+f1∗fn−2+…+fn−1∗f0f_n=f_0*f_{n-1}+f_{1}*f_{n-2}+\ldots+f_{n-1}*f_{0}fn​=f0​∗fn−1​+f1​∗fn−2​+…+fn−1​∗f0​
这个和卡特兰数列的递归定义是一模一样的


凸多边形的三角划分

一个凸的nnn边形,用直线连接他的两个顶点使之分成多个三角形,每条直线不能相交,问一共有多少种划分方案

答案还是卡特兰数列

我们在凸多边形中随便挑两个顶点连一条边,这个凸多边形就会被分成两个小凸多边形,由于每条直线不能相交,接下来我们就只要求这两个小凸多边形的划分方案然后乘起来即可

和二叉树的构成问题一样,我们枚举大凸多边形被分成的两个小凸多边形的大小即可


阶梯的矩形划分

一个阶梯可以被若干个矩形拼出来
图示是两种划分方式


像下图是不合法的划分方式

问,一个nnn阶矩形有多少种矩形划分

答案仍然是卡特兰数列

我们考虑阶梯的每个角

如图

每个角一定是属于不同的矩形的,我们考虑和左下角属于一个矩形的是哪个角
这个矩形将这个梯形又分成两个小梯形,如图

于是我们又可以写出递推式了
和卡特兰数列的递归式是一样的

卡特兰数就讲这么多吧

如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧

卡特兰(Catalan)数入门详解相关推荐

  1. python语言编程基础-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

  2. python语言入门m-Python语言入门详解!快速学成Python!

    今日主题 "Python语言入门详解" 近两年来,Python语言借着数据科学和人工智能的"东风"成为了最流行的编程语言--街头巷尾人们口口相传.同时,Pyth ...

  3. python符号格式化设置区间_Python 数值区间处理_对interval 库的快速入门详解

    使用 Python 进行数据处理的时候,常常会遇到判断一个数是否在一个区间内的操作.我们可以使用 if else 进行判断,但是,既然使用了 Python,那我们当然是想找一下有没有现成的轮子可以用. ...

  4. python语言入门-Python语言入门详解!快速学成Python!

    原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...

  5. FFmpeg入门详解之83:流媒体与直播技术

    流媒体 流媒体又叫流式媒体,它是指商家用一个视频传送服务器(比如:vlc)把节目(比如:ande10.mp4)当成数据包发出,传送到网络上.用户通过解压设备对这些数据进行解压后,节目就会像发送前那样显 ...

  6. FFmpeg入门详解之121:颜色空间转换RGB和YUV的原理与实战

    5.颜色空间转换RGB和YUV的原理与实战 三种颜色空间模型:RGB.YUV.HSV 一.概述 颜色通常用三个独立的属性来描述,三个独立变量综合作用,自然就构成一个空间坐标,这就是颜色空间. 但被描述 ...

  7. FFmpeg入门详解之111:RTSP协议2

    rtsp消息详解 1.RTSP的消息有两大类,一是请求消息(request),一是回应消息(response),两种消息的格式不同. 请求消息格式: 方法 URI RTSP版本 CR LF 消息头 C ...

  8. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  9. FFmpeg入门详解之86:RTP/RTCP协议讲解

    RTP RTP:(Real-time Transport Protocol) 是用于Internet上针对多媒体数据流的一种传输层协议.RTP 协议和 RTP 控制协议 RTCP 一起使用,而且它是建 ...

最新文章

  1. 我国IPv6规模要达到世界第一
  2. jena fuseki RDF应用
  3. mysqlshow命令的用法介绍
  4. ASP.NET Core启动地址配置方法及优先级顺序 | .NET 6 版本
  5. android 布局收缩成球,Android使用Material Design实现悬浮按钮
  6. Linux 命令(77)—— killall 命令
  7. js,css压缩工具
  8. ACM程序设计选修课——1024: 末位零(求末尾0的方法+可有可无的快速幂)
  9. java的关闭钩子(Shutdown Hook)
  10. [幽默漫画]对于程序猿来说deadline很容易搞定!
  11. 条件编译#ifndef和#endif
  12. vmware 12 许可证秘钥
  13. SN号获取及显示不全的问题
  14. 【数据库】用户sa登录失败,错误:18456
  15. 利用python对包含离散型特征和连续型特征的数据进行预处理
  16. duilib入门简明教程(1)
  17. Creator动态获取,数据文,JSON并使用,枚举Enum,cc.sys.localStorage获取音效的判断 ,冒泡排序做排行榜 ,动态获取提示(cc.loader.loadRes),制作签到
  18. Python总结-学习方向和方法
  19. Java+Selenium+Chrome、Firefox自动化测试环境搭建
  20. 心血漏洞(OpenSSL升级)

热门文章

  1. 超简单的Springboot 项目搭建
  2. 链表的回文结构@Nowcoder—— 单链表
  3. Haskell学习笔记: type and typeclasses
  4. Haskell 中的 Monad 和 IO
  5. 基于java+swing+mysql员工工资管理系统
  6. C# httppost 302 错误
  7. Jetpack支持库CameraX使用入门——相机预览
  8. Python 网页截图
  9. asp.net 如何用webclient上传文件
  10. framebuffer应用编程及文字显示(2)