锐腾君也已经好久没有出现了qwq
最近大学的朋友们忙着期末季,高中的朋友们也忙着1月份的选考/春考/期末考。大家也都忙碌了起来。
本周一,锐腾的一门课也迎来了期末考试。
先小小的安利一下,复旦学子如果还缺模块课选,可以考虑第五模块的《计算思维》哦,汪老师和黄老师讲课也很有意思,而且这门课也确实能学到许多东西。上课甚至可以和黄老师来一些神奇的互动(划掉)
这门课的期末其中一道考题是这样的。
对于个元素进行入栈出栈操作,总共有多少种出栈序列?
可能有相当一部分读者并不明白这个问题的内容。但是并不影响大家来看我本篇文章。
本文大纲
1.从合法括号串引出Catalan计数问题
2.利用递推方法,求解Catalan计数问题
3.利用基本计数方法,求解Catalan计数问题
*4.从Dyck路问题再看Catalan计数问题
*5.简单的生成函数理论
*6.利用生成函数理论,求解Catalan计数问题
7.Catalan数的一些实际问题应用
阅读建议
对于数学基础较一般的读者可以略过4,5,6部分,读1,2,3,7部分,若第3部分读不懂,可以直接略去证明看结论。
对于有能力的读者,可以选读4,5,6部分。
从合法括号串引出Catalan计数问题
我们首先来看这样一个问题:
我们知道,电脑识别一些含有括号的表达式的时候,会自动进行配对。但是它在内部是如何进行配对的呢?
例如我们对下面这个含括号的表达式而言
(a+(b-c)*2)^(d+e)
我们要判断它的括号结构,其实只需要单独抽出括号,即:(())()
这种只含有左括号和右括号的表达式,我们称之为括号串。
现在我们要研究的是,什么样的括号串才是合法的。且对于长度相同的括号串,合法的有括号串有多少?
首先,我们的左括号,必然要有右括号和它配对,也就是说,无论我们读到这个括号串的哪个位置,我已经读到过的右括号数不能超过左括号数。
比如我们对于1对左右括号,我们有1种合法括号串:()
对于2对左右括号,我们有2种合法括号串:(()) ; ()()
对于3对左右括号,我们有5种合法括号串:((())) ; ()(()) ; ()()() ; (())() ; (()())
接下来我们要探究的问题就是,对于
这类计数问题被称为Catalan计数问题,它的解被称为Catalan数。我们约定
为了方便起见,我们考虑0对括号串,它唯一对应了一种合法括号串,即空字符串。因此我们认为
利用递推方法,求解Catalan计数问题
一个和自然数相关的命题我们当然希望能够用自然数的工具解决。递推方法不失为一种好的解决自然数相关命题的办法,我们不妨来尝试一下。
首先我们观察一下
比如 (())()
我们可以将其拆分成两个大的结构 (()) ()
这两个大的结构中,每一部分都满足:除了结尾处外,无论数到哪个位置,左括号的数量一定严格大于右括号。
这样的结构对于我们来说,刚刚好就是将括号向下套娃再向上回来,回到了地面的那一步,是所有括号串中最基本的结构类型。我们将其称为本原括号串。
![7fe96c12d266f2b9443ab8aef997a946.png](https://img-blog.csdnimg.cn/img_convert/7fe96c12d266f2b9443ab8aef997a946.png)
我们回到原问题:
我们直接考虑所有的合法括号串可能有点难,但是从本原括号串出发考虑问题可能会简单些。
我们假定对
本原括号串去掉第一个左括号和最后一个右括号就是一个
![c6ad590cce23dadf13ea941e021dbf82.png](https://img-blog.csdnimg.cn/img_convert/c6ad590cce23dadf13ea941e021dbf82.png)
我们来考虑
![fdd444ab3e6a0b4b725f2b014538355a.png](https://img-blog.csdnimg.cn/img_convert/fdd444ab3e6a0b4b725f2b014538355a.png)
若第一个本原括号串只用了