写在前面:卡特兰数这东西感觉挺常用的,并且公式很简单,那就花一下午总结一下,学点皮毛吧(反正遇到我还是不会 )

[PDF] 大三上组合数学课堂讲义

文章目录

  • 卡特兰数定义
  • 卡特兰数的性质
  • 卡特兰数证明(折线法)(n和m相同)
  • LeetCode 96. 不同的二叉搜索树
  • n + 1 个叶子节点能够构成多少种形状不同的“xxx”二叉树
  • 例:买票
  • 例:图书馆借还书
  • 例:出栈顺序
  • 例:括号匹配
  • 例:2*n矩阵(每行递增,每列递增)
  • 不相交弦问题
  • 例:典型例题
  • 提升题:电影购票(n和m不同)
  • 参考资料

卡特兰数定义

卡特兰数的性质


记住前几项:C0C_0C0​ =1,C1C_1C1​ = 1,C2C_2C2​ = 2,C3C_3C3​ = 5,C4C_4C4​ = 14

卡特兰数问题一般都存在匹配关系

(1)求组合数形式
Cn=(2nn)n+1=(2nn)−(2nn−1)C_n = \frac{\binom{2n}{n}}{n + 1} =\binom{2n}{n} - \binom{2n}{n-1} Cn​=n+1(n2n​)​=(n2n​)−(n−12n​)
求组合数有四种方法,详见:常用算法代码模版4—数学知识

(2)递推形式(这个递推公式用上面组合数形式推导一下就出来了!
Cn=4n−2n+1Cn−1,其中C0=C1=1C_n = \frac{4n-2}{n + 1}C_{n-1},\text{其中}C_0 = C_1 = 1 Cn​=n+14n−2​Cn−1​,其中C0​=C1​=1
可以用递归来求,也可以用记忆化数组来求(空间换时间)

数据较大要取模 p 时,注意除数取模要先取逆元

(3)基本公式
Cn+1=∑i=0nCiCn−i,其中C0=C1=1C_{n+1} = \sum _ {i = 0} ^ n C_i C _ {n - i},\text{其中}C_0 = C_1 = 1 Cn+1​=i=0∑n​Ci​Cn−i​,其中C0​=C1​=1
或者
fn=f0∗fn−1+f1∗fn−2+⋯+fn−1∗f0,其中n>=2f_n = f_0 * f_{n-1} + f_1 * f_{n - 2} + \cdots + f_{n-1}*f_0,其中n >= 2 fn​=f0​∗fn−1​+f1​∗fn−2​+⋯+fn−1​∗f0​,其中n>=2

例如:1到n构成的二叉树搜索树的总数为CnC_nCn​,则当以1为根节点时,左子树有0个节点,右子树有n-1个节点,所以有C0∗Cn−1C_0 * C_{n-1}C0​∗Cn−1​种,以2为根节点有C1∗Cn−2C_1 * C_{n-2}C1​∗Cn−2​种,所以CnC_nCn​是卡特兰数,所以Cn=4n−2n+1Cn−1,其中C0=C1=1C_n = \frac{4n-2}{n + 1}C_{n-1},\text{其中}C_0 = C_1 = 1Cn​=n+14n−2​Cn−1​,其中C0​=C1​=1

可以用二重循环求

说明:通常满足上面任意公式的都是卡特兰数

卡特兰数四个公式(简单)

注意:由于卡特兰数增长速度较快,当 n 等于 17 时,卡特兰数将会超过 int 最大值,造成溢出(Python 除外),建议用long long来存。对于 Java 语言来说,可以使用 BigInteger 来计算大整数。



—— 摘自Wikipedia


卡特兰数证明(折线法)(n和m相同)

卡特兰数Cn=(2nn)n+1=C(2n,n)n+1=(2nn)−(2nn−1)C_n = \frac{\binom{2n}{n}}{n + 1} = \frac{C(2n,n)}{n + 1} =\binom{2n}{n} - \binom{2n}{n-1}Cn​=n+1(n2n​)​=n+1C(2n,n)​=(n2n​)−(n−12n​)

LeetCode 96. 不同的二叉搜索树

LeetCode 题解 | 96. 不同的二叉搜索树(卡特兰数 C++)

n + 1 个叶子节点能够构成多少种形状不同的“xxx”二叉树

“xxx”二叉树的每个非叶子结点一定都有左右子树(匹配关系

使用深度优先搜索这个二叉树,向左扩展时标记为 +1,向右扩展时标记为 -1

一个卡特兰序列(n + 1个点)对应一棵二叉树

例:买票

绘画展览门票每张5元,如果有2n个人排队购票,每人一张,并且其中一半人恰有5元钱,另一半人恰有10元钱,而票房无零钱可找,那么如何将这2n个人排成一列,顺次购票,使得不至于因票房无零钱可找而耽误时间,应该采用什么算法解决呢?

例:图书馆借还书

在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数?

解:队伍是排成一列的,联想Catalan证明的图

h(3)=6!/(3!∗4!)=5h(3)=6!/(3!*4!)=5h(3)=6!/(3!∗4!)=5,所以总数=h(3)∗3!∗3!=180\text{总数}=h(3)*3!*3!=180总数=h(3)∗3!∗3!=180

注意:算种类时,最后要乘以3!和3!

例:出栈顺序

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

思路
将问题转化为:入栈的数的个数总是要大于或者等于出栈数的个数。进栈相当于+1,出栈相当于-1

如:序列1 2 3的出栈序列可以表示为+1,-1,+1,+1,-1,-1

计算出栈序列数目,就是卡特兰数C(2n,n)/(n+1) (n=1,2,3,…)

例:括号匹配

n 对括号,则有多少种 “括号匹配” 的括号序列?

思路
左括号看成 +1,右括号看成 -1,类似进出栈

例:2*n矩阵(每行递增,每列递增)


思路
把第一排看作进栈+1,第二排看作出栈-1,同时要一直保证第一排填充的数大于等于第二排填充的数(递增要求)
按照 1 到 2n 的顺序填入矩阵,111 放第一排,对应卡特兰序列中x1=+1x_1=+1x1​=+1,…

显然:长度为2n的卡特兰序列与2 X n矩阵的填法一一对应

不相交弦问题

在一个圆周上分布着 2n 个点,两两配对,并在这两个点之间连一条弦,要求所得的 2n 条弦彼此不相交的配对方案数

思路
满足 fn=f0∗fn−1+f1∗fn−2+⋯+fn−1∗f0,其中n>=2f_n = f_0 * f_{n-1} + f_1 * f_{n - 2} + \cdots + f_{n-1}*f_0,其中n >= 2fn​=f0​∗fn−1​+f1​∗fn−2​+⋯+fn−1​∗f0​,其中n>=2 的一定是卡特兰数

Leetcode 1259:不相交的握手
这题一看样例就知道是卡特兰数

例:典型例题

提升题:电影购票(n和m不同)

当进栈 +1 有 m 个, 出栈 -1 有 n 个时,序列共有Cm+nm−Cm+nm+1C_{m+n} ^ m - C _ {m + n} ^ {m + 1}Cm+nm​−Cm+nm+1​种可能性

电影票一张 50 coin,且售票厅没有 coin。m 个人各自持有 50 coin,n 个人各自持有 100 coin。则有多少种排队方式,可以让每个人都买到电影票?

思路
持有 50 coin 的人看作 +1,持有 100 coin 的人看作 -1,类似进出栈问题
与卡特兰数不同的是,这里有 m 个 +1,有 n 个 -1

我们还是可以用折线法来解决这个问题:

由于排队有先后顺序,所以总共有 (Cm+nm−Cm+nm+1)∗m!∗n!(C_{m+n} ^ m - C _ {m + n} ^ {m + 1}) * m! * n !(Cm+nm​−Cm+nm+1​)∗m!∗n!种可能

注:Cm+nm−Cm+nm+1C_{m+n} ^ m - C _ {m + n} ^ {m + 1}Cm+nm​−Cm+nm+1​这部分直接推导即可

参考资料

[1] 卡特兰数 — 计数的映射方法的伟大胜利
[2] 【证明】卡特兰数(折线法)
[3] 一道面试题到卡特兰数及其应用
[4] 卡特兰数(catalan数)总结 (卡特兰大数、卡特兰大数取模、卡特兰数应用)
[5] 卡特兰(Catalan)数入门详解 —— 例题的证明讲得不错
[6] LeetCode -「算法入门笔记」卡特兰数

算法基础 - 数论 | 组合数学 卡特兰数(Catalan number)定义、证明及例题相关推荐

  1. 卡特兰数 Catalan number

    卡特兰数 Catalan number 卡特兰数前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 74290 ...

  2. java编程求卡特兰数_卡特兰数(Catalan Number)

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

  3. 卡特兰数Catalan number的应用

    卡特兰数(Catalan number)的应用 使用场景 计算公式   卡特兰数是一个特殊的数列,基于这个数列,可以找出很多有趣的问题,对于我们学计算机的而言,与这个数列打交道是不可避免了,举一个很经 ...

  4. 卡特兰数Catalan Number

    Catalan Number满足下列递推公式: N个元素元素进栈,多少种出栈方式 考虑A.B.C.D依次进栈,那么所有的出栈顺序是下列4种情况的并集: 1)A第一个出栈.肯定是A进栈后马上出栈,剩下B ...

  5. 【算法讲11:卡特兰数】默慈金数 | 那罗延数 | 施罗德数

    [算法讲11:卡特兰数]默慈金数 | 那罗延数 | 施罗德数 ⌈\lceil⌈卡特兰数⌋\rfloor⌋Catalan Number 引入 思考 ⌈\lceil⌈卡特兰数⌋\rfloor⌋的性质 ⌈\ ...

  6. 卡特兰数——Catalan数

    卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列.由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡塔兰数的一般项公式为  通常使用的递归式:  h(n)=((4*n-2) ...

  7. 卡特兰数 Catalan数

    From: http://www.cppblog.com/MiYu/archive/2010/08/07/122573.html 维基百科资料: 卡塔兰数 卡塔兰数是组合数学中一个常出现在各种计数问题 ...

  8. 卡特兰数 Catalan

    做初赛题,回顾到以前学的一些知识,发现还有其他广泛的应用,所以在此记录并当作复习,若有不当之处,随时欢迎读者斧正. Catalan 卡特兰数又称卡塔兰数,卡特兰数是组合数学中一个常出现在各种计数问题中 ...

  9. 知识点 组合数学 卡特兰数

    关于卡特兰数 卡特兰数是一种经典的组合数,经常出现在各种计算中,其前几项为 : 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, ...

最新文章

  1. 画布之轮播图片HTML5,Axure原型设计之轮播图
  2. [转]Windows CE 编程的十点忠告(by pdasky)
  3. 洛谷——P1051 谁拿了最多奖学金
  4. JavaScriptSerializer序列化与反序列化--备忘
  5. 百万数据php7取出循环_PHP7带来了哪些重要的变化
  6. 使用FFTW3做二维DFT的示例代码
  7. 勒让德方程(多项式)和缔合勒让德方程(多项式)和球谐函数
  8. SPSS软件做配对t检验
  9. Delta RPMs disabled because /usr/bin/applydeltarpm not installed.问题解决记录
  10. vue中清除路由缓存
  11. 专访李明远,理清直达号九大疑问
  12. eclipse java swt_Eclipse swt开发环境搭建
  13. svn认证失败两种解决方案(个人原创)
  14. mysql按照中文首字母排序
  15. 英语论文写作技巧-2
  16. 计算机屏幕出现条纹w7,电脑屏幕出现条纹,教您电脑屏幕出现条纹闪烁怎么解决...
  17. shell判断给定日期是否是周末or月末
  18. osi是什么?计算机有哪几层?每一层有什么作用?
  19. Python3网络爬虫(十二):初识Scrapy之再续火影情缘
  20. 计算机版本歌曲,酷我音乐2017旧版大全

热门文章

  1. 阿里巴巴16字管理真言
  2. 奇舞团十周岁生日快乐!
  3. 重磅!解密央行数字货币研究所第二任所长穆长春(附完整个人简历)
  4. Qt5.7关于Quazip的编译和使用
  5. jQuery中遍历元素,创建元素,添加元素,删除元素汇总
  6. mysql哪个皮肤好用_phpMyAdmin换新皮肤让美观加持
  7. 无线网打不开无服务器,无线路由器可以上网但网页打不开怎么办
  8. 用于光学测量的菲索干涉仪
  9. Flask中的ORM使用
  10. 触摸菜单:纸质菜单终结者