【知识总结】卡特兰数 (Catalan Number) 公式的推导
卡特兰数的英文维基讲得非常全面,强烈建议阅读!
Catalan number - Wikipedia
(本文中图片也来源于这个页面)
由于本人太菜,这里只选取其中两个公式进行总结。
(似乎就是这两个比较常用?)
首先先扔卡特兰数的定义式
\[Catalan_n=\prod_{i=1}^{n-1}Catalan_i*Catalan_{n-i}\]
(卡特兰数的很多应用,比如二叉树形态数,出栈序列数等,都由这个定义式得到。详见英文维基)
公式1 (通项公式) :
\[Catalan_n=\frac{1}{n+1}C_{2n}^n\]
在上文提到的出栈序列的问题情景中,如果有\(n\)个元素,在平面直角坐标系中用\(x\)坐标表示入栈数,\(y\)坐标表示出栈数,则坐标\((a,b)\)表示目前已经进行了\(a\)次入栈和\(b\)次出栈,则再进行一次入栈就是走到\((a+1,b)\),再进行一次出栈就是走到\((a,b+1)\)。并且,由于入栈数一定小于等于出栈数,所以路径不能跨越直线\(y=x\)
因此,题目相当于求从\((0,0)\)走到\((n,n)\)且不跨越直线\(y=x\)的方案数
首先,如果不考虑不能跨越直线\(y=x\)的要求,相当于从\(2n\)次操作中选\(n\)次进行入栈,则方案数为\(C_{2n}^n\)。
然后,考虑对于一种不合法的方案,一定在若干次操作后有一次出栈数比入栈数多一次,这个点在直线\(y=x+1\) (即下图中红色的线) 上。那么把第一次碰到该直线以后的部分关于该直线对称,则最终到达的点是\((n-1,n+1)\) (如下图) 。
![]()
图源:英文维基 (即文首网址)
显然,任何非法方案都可以通过此方式变成一条从\((0,0)\)到\((n-1,n+1)\)的路径,有\(C_{2n}^{n+1}\)种。而任何合法方案由于不接触直线\(y=x+1\),无论从哪个点对称都不是一条连续的路径。由于合法方案数就是\(Catalan_n\),所以:
\[
\begin{aligned}
Catalan_n&=C_{2n}^n-C_{2n}^{n+1}\\
&=\frac{(2n)!}{n!*n!}-\frac{(2n)!}{(n+1)!*(n-1)!}\\
&=\frac{1}{n+1}(\frac{(2n)!*(n+1)}{n!*n!}-\frac{(2n)!}{n!*(n-1)!})\\
&=\frac{1}{n+1}(\frac{(2n)!*(n+1)}{n!*n!}-\frac{(2n)!*n}{n!*n!})\\
&=\frac{1}{n+1}*\frac{(2n)!*(n+1)-(2n)!*n}{n!*n!}\\
&=\frac{1}{n+1}*\frac{(2n)!}{n!*n!}\\
&=\frac{1}{n+1}C_{2n}^n\\
\end{aligned}
\]
公式2 (递推公式) :
\[Catalan_{n+1}=\frac{4n+2}{n+2}Catalan_n\]
(这个公式的推导过程似乎网上没有,估计是思路太简单了……我太菜了想了半天才推出来)
由上面那个通项公式得
\[
\begin{aligned}
Catalan_{n+1}&=\frac{1}{n+2}C_{2n+2}^{n+1}\\
&=\frac{1}{n+2}*\frac{(2n+2)!}{(n+1)!*(n+1)!}\\
&=\frac{1}{n+2}*\frac{(2n)!*(2n+1)*(2n+2)}{n!*n!*(n+1)^2}\\
&=\frac{1}{n+2}*\frac{(2n+1)*(2n+2)}{(n+1)}*\frac{1}{n+1}*\frac{(2n)!}{n!*n!}\\
&=\frac{2(2n+1)}{n+2}*\frac{1}{n+1}*C_{2n}^n\\
&=\frac{4n+2}{n+2}Catalan_n\\
\end{aligned}
\]
【知识总结】卡特兰数 (Catalan Number) 公式的推导的更多相关文章
- 浅谈卡特兰数(Catalan number)的原理和相关应用
一.卡特兰数(Catalan number) 1.定义 组合数学中一个常出现在各种计数问题中出现的数列(用c表示).以比利时的数学家欧仁·查理·卡特兰的名字来命名: 2.计算公式 (1)递推公式 c[ ...
- 卡特兰数 catalan number
作者:阿凡卢 出处:http://www.cnblogs.com/luxiaoxun/ 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留 ...
- 卡特兰数(Catalan Number) 算法、数论 组合~
Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列.以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名. 卡特兰数的前几个数 前20项为( ...
- 卡特兰数(Catalan Number) 学习笔记
一.三个简单的问题 1.给定一串长为2n的01序列,其中0和1的数量相等,满足任意前缀中0的个数不少于1的个数,求序列的个数 2.给出一串长为n的序列,按顺序将他们进栈,随意出栈,求最后进出栈的方案 ...
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...
- 卡特兰数 Catalan数 ( ACM 数论 组合 )
卡特兰数 Catalan数 ( ACM 数论 组合 ) Posted on 2010-08-07 21:51 MiYu 阅读(13170) 评论(1) 编辑 收藏 引用 所属分类: ACM ( 数论 ...
- 卡特兰数 Catalan 笔记
一.公式 卡特兰数一般公式 令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>= ...
- 卡特兰数Catalan——定义、公式、模型总结
推荐:卡特兰数总结 定义: f(i)表示,从(0,0)出发,到(i,i),每次只能向上或者向右走,并且不越过红线的方案数. 这个图片的点上的数字,其实告诉我们f[i],就可以根据这个n方dp得到. 其 ...
- ACM数论-卡特兰数Catalan
Catalan 原理: 令h(0)=1,h(1)=1,catalan 数满足递归式: (其中n>=2) 另类递推公式: 该递推关系的解为: (n=1,2,3,...) 卡特兰数的应用实质上都是递 ...
随机推荐
- python3返回值中的none
浏览器返回null,python3返回none,懵了. google了很多资料,不明就里,这就是没基础的后果啊呀呀呀. 上阮一峰的截图,就这么理解下凑合吧:
- python+pyqt5实现24点小游戏
本文实例为大家分享了python实现24点游戏的具体代码,供大家参考,具体内容如下 描述:一副牌中A.J.Q.K可以当成是1.11.12.13.任意抽取4张牌,用加.减.乘.除(可加括号)把牌面上的数 ...
- springcloud(十二):Ribbon客户端负载均衡介绍
springcloud(十二):Ribbon客户端负载均衡介绍 Ribbon简介 使用分布式微服务脚骨的应用系统,在部署的时候通常会为部分或者全部微服务搭建集群环境,通过提供多个实例来提高系统的稳定型 ...
- lua 栈最后调用的函数,用于看调试信息
lua_getinfo int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); 返回一个指定的函数或函数调用的信息. 当用于取 ...
- Android StatusBarUtil:设置Android系统下方虚拟键键盘透明度
Android StatusBarUtil:设置Android系统下方虚拟键键盘透明度 Android StatusBarUtil是github上的一个开源项目,主页:https://githu ...
- noip模拟赛 读
分析:感觉很像是贪心,但是直接贪找不到方法.一个暴力的想法是枚举最小步数,然后看每个指针能够覆盖到的位置,看看能不能覆盖到所有点.这个求最大覆盖就有点贪心的思想,因为给的ai,bi都是递增顺序的,考虑 ...
- gh-ost: triggerless online schema migrations:Blog by Shlomi Noach:
http://code.openark.org/blog/category/mysql https://rj03hou.github.io/mysql/gh-ost/
- Wincc操作数据库SQLSERVER
WINCC写数据库 在WINCC的图形编辑器中,在输入域的属性中.选择事件.再选择键盘的释放动作,在动作代码框中写下例如以下代码: Dim conn,rs Dim strsql Dim a a=HM ...
- iOS常用的正则表达式总结
/* 正则表达式说明: . 匹配除换行符以外的任意字符 \\w 匹配字母或数字或下划线或汉字 \\s 匹配任意的空白符 \\d 匹配数字 \\b 匹配单词的开始或结束 ^ 匹配字符串的开始 $ 匹配字 ...
- LeetCode 438. Find All Anagrams in a String (在字符串中找到所有的变位词)
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...