卡特兰数(Catalan Number)相关问题整理

Catalan数的相关问题整理

Catalan数的引入与数学表达

卡特兰数可以简单理解为这样一个问题的解:对于一个已知长度的数列,其中包含n个+1,n个-1,这个数列就是这2n个数字的随机排列,那么如果要求任意一个前k项的和都不能是负数的话,这样的排列有多少种?
这个解就是卡特兰数构成的数列,下标为n。

下面是卡特兰数的一些数学性质:

卡特兰数(Catalan Number)相关问题整理_第1张图片

这里的Cn表示下表为n的卡特兰数。

卡特兰数的实例

1. 进出stack的问题:

卡特兰数(Catalan Number)相关问题整理_第2张图片

比如上图,把1234的数列依次放入stack中,假设栈足够大,那么可以push也可以pop,则一共有多少种进出栈的方法?
实际上用栈的例子反而比起上面的+-1的数列部分和的定义更好理解,因为这里的部分和非负不是人为定义的,而是因为stack不可能在空的状态下还pop元素。记push为+1,pop为-1,那么必须在任意时刻都是push的不少于pop的。由此可以推出catalan数的递推公式:

Catalan(n)=Catalan(0)Catalan(n1)+...+Catalan(k1)Catalan(nk)+...+Catalan(n1)Catalan(0) C a t a l a n ( n ) = C a t a l a n ( 0 ) ∗ C a t a l a n ( n − 1 ) + . . . + C a t a l a n ( k − 1 ) ∗ C a t a l a n ( n − k ) + . . . + C a t a l a n ( n − 1 ) ∗ C a t a l a n ( 0 )

递推公式的解释

下面解释原因,首先,找到通项,就是 Catalan(k1)Catalan(nk) C a t a l a n ( k − 1 ) ∗ C a t a l a n ( n − k ) ,这项表示假设我们的push顺序为1~n,那么考虑第k个元素最后出栈,这意味着,所有其他的元素都已经在他之前出栈了,那么就有这么两种情况:一种是,在它前面的元素比他先出去,另一种是它后面的比他先出去。前面的元素先与k出栈,也就是1~k-1 ,虽然进去的早,但是它们在k入栈之前就已经pop掉了,因此也不会被k压在下面,这个情况的可能状态数就是Catalan(k-1);还有一种是入栈晚,就是k+1~n,这些元素在k最后出栈的情况下总共有Catalan(n-k)种可能性。而前后的这些元素的表现是独立的,所以用乘法原理。而第k个元素使我们的假设,实际上k可以是1~n的任何一个数,所以要加起来才是总的结果,这就是递推式。

通项公式的解释

catalan数的通项公式为:

Catalan(n)=1n+1(2nn)=(2nn)(2nn1) C a t a l a n ( n ) = 1 n + 1 ( 2 n n ) = ( 2 n n ) − ( 2 n n − 1 )

首先,回到+-1的场景,对于这样一个数列,如果没有restriction,那么排列总共有2n choose n,那么哪些不合格呢?不合格的就是它们中间出现了某个部分和,是小鱼0的。那么我们对于这样的数列,找到第一个使得部分和小鱼0的数,那么这个就是一个-1,(因为是 第一个,假如这个是+1,那么前面就得是-2,所以它就不是第一个,稍微归谬一下),我们做如下操作:把这个数,连同它前面的数,都乘以-1,则,前面的正负一一样多,这里多了个+1,所以总数上来说,一共有n+1个+1,n-1个-1。如果能说明这个变换对于calatan不合格的数列和n+1个+1和n-1个-1的全排列是一个一一映射的话,那么问题就解决了,实际上,这就是一个一一映射,因为对于这个n+1个+1和n-1个-1的全排列,总能找到一个位置,在这里,数列的部分和第一次为+1,那么把这前面的包括这个+1乘以-1,就构造出了一个catalan不合格数列。所以,合格的数列就是两种排列的差。

2. 二叉树的构成

给定结点数目,问可以构成多少种二叉树结构。可以考虑,对树进行一个后序遍历,那么可以看做是根节点最后出栈,先把左子树push和pop完,再把右子树push和pop完,最后pop根节点,对应于进出栈问题,因此就是catalan数。

这里写图片描述

3. 不跨对角线走格子

这个就是catalan问题的一个几何解释,很明显,不解释。

卡特兰数(Catalan Number)相关问题整理_第3张图片

4. 找零钱问题

比如,某个东西5元钱,有n个人有5元,有n个人有10元,在可以找零的情况下,有多少排队方案?
实际上就是把卖家看成一个栈,卖家不能找不开零钱也相当于就是说栈不能pop空栈。
明显的catalan数。

5. 括号匹配或连乘顺序问题

对于一个连乘 ABCD... A ∗ B ∗ C ∗ D . . . ,可以任意加括号,那么有多少种顺序?
实际上就是问,有多少中可能的合法的括号匹配。
左括号+1,右括号-1,可以左括号多右括号少,因为后面可以补全,但是反之不行,就是+-1场景下的catalan问题。

5. 圆上的不相交弦问题

卡特兰数(Catalan Number)相关问题整理_第4张图片

从某个点开始,顺时针依次标注弦上两端点为+1或-1,先遇到的标+1,后面的标-1,不相交弦实际上就是+-1的catalan问题,也可理解为一根弦的两点都要被压栈,而必须整条弦都pop出来才能在pop更早的弦或者进新弦。总之,是一个catalan问题。

其他的还有很多栗子,可以移步卡特兰数 — 计数的映射方法的伟大胜利

本文中图片都来源于这里的内容,特此声明。

2018年03月10日01:12:42

仇恨,即便是对卑鄙者的仇恨,也会扭曲外貌。 —— 戏剧家,贝尔托 布莱希特

你可能感兴趣的:(杂项)