卡特兰数(Catalan Number) 卡特兰数(Catalan Number)

卡特兰数(Catalan Number)

 

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

  1. 卡特兰数递归式的含义解释
  2. 卡特兰数表达式的证明过程
  3. 卡特兰数的计算机中的应用

Catalan Number递归式解释

假设h(0)=1,h(1)=1,catalan数满足递推式:

h(n)=h(0)h(n1)+h(1)h(n2)+h(2)h(n3)+...+h(n1)h(0)(1.1)(1.1)h(n)=h(0)∗h(n−1)+h(1)∗h(n−2)+h(2)∗h(n−3)+...+h(n−1)∗h(0)

递归式背后有什么物理含义呢,这里以出栈序列问题进行说明:

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

含义解释:首先,我们设h(n)h(n)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则,由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有h(k1)h(k−1)种,而之后比k大的值入栈,且都在k之前出栈,因此有h(nk)h(n−k)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,h(nk)h(k1)h(n−k)∗h(k−1)种,求和便是Catalan递归式。

Catalan Number表达式证明

第n个卡特兰数h(n)表达式如下

h(n)=Cn2nn+1=Cn2nCn12n(1.2)(1.2)h(n)=C2nnn+1=C2nn−C2nn−1

具体证明过程如下

为了便于编程实现,需要进一步推导h(n)与h(n-1)之间的关系

已知h(n)h(n),易知

h(n1)=Cn12n2nh(n−1)=C2n−2n−1n

推导 h(n)h(n)的Cn2nC2nn和h(n1)h(n−1)的Cn12n2C2n−2n−1之间的关系,由kCkn=nCk1n1kCnk=nCn−1k−1知
nCn2nCn2nCn2nCn2nCn2nn+1h(n)=2nCn12n1=2Cn12n1=2(2n1)Cn12n2n=2(2n1)h(n1)=2(2n1)n+1h(n1)=2(2n1)n+1h(n1)(1)(2)(3)(4)(5)(6)(1)n∗C2nn=2nC2n−1n−1(2)C2nn=2C2n−1n−1(3)C2nn=2(2n−1)C2n−2n−1n(4)C2nn=2(2n−1)h(n−1)(5)C2nnn+1=2(2n−1)n+1h(n−1)(6)h(n)=2(2n−1)n+1h(n−1)

最终得到h(n)h(n)和h(n1)h(n−1)之间的递归式h(n)=2(2n1)n+1h(n1)h(n)=2(2n−1)n+1h(n−1)

Catalan Number应用实例

括号匹配问题

问题描述: 矩阵连乘 P=A1A2...AnP=A1A2...An,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,问有几种括号化的方案?

问题转换一下就是n对括号的正确匹配方案,可以做一下LeetCode-22

出栈次序问题

问题描述: 一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?

出栈问题问题正是卡特兰数递归式h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)h(n)=h(0)h(n−1)+h(1)h(n−2)+...+h(n−1)h(0)的由来

相关应用问题

  1. 有2n个人排成一行进入剧场,入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

  2. n个1和n个0组成一个2n位的二进制数,要求从左到右扫描,0的累计数不小于1的累计数,求满足条件的的数。

  3. 12个人排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

    我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排。对问题进行转化:用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,并且任意前缀中0的个数大于等于1的个数就对应一种方案,转化后的问题就是问题2了。

  4. 给定节点组成二叉树的问题:给定n个节点,能构成多少种形状不同的二叉树?

    先取一个点作为顶点,然后左边依次可以取0至n-1个相对应的,右边是n-1到0个,两两配对相乘,就是h(0)h(n1)+h(2)h(n2)+...+h(n1)h(0)=h(n)h(0)∗h(n−1)+h(2)∗h(n−2)+...+h(n−1)h(0)=h(n)能构成h(n)h(n)个,因此二叉树问题也可以解释卡特兰数递归式(1.1)式的由来

  5. n*n棋盘从左下角走到右上角而不穿过主对角线的走法?

    要从左下角走到右上角则必须向上走n步,向右n步,同时为了不跨过主对角线,则走过的步数中向上走的步数必须大于等于向右走的步数,剖析之后发现这个问题与问题3是等价问题,走法有卡特兰数h(n)h(n)种。

    可以做一下下面两题练练手:

    hdoj2067-小兔的棋盘

    LeetCode62-Unique Paths

  6. n个+1和n个-1构成的2n项序列,其部分和总满足:a1+a2+...+an>=0a1+a2+...+an>=0的序列的个数。

    卡特兰数表达式(1.2)式就是以该问题模型为基础推导出来的

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

  1. 卡特兰数递归式的含义解释
  2. 卡特兰数表达式的证明过程
  3. 卡特兰数的计算机中的应用

Catalan Number递归式解释

假设h(0)=1,h(1)=1,catalan数满足递推式:

h(n)=h(0)h(n1)+h(1)h(n2)+h(2)h(n3)+...+h(n1)h(0)(1.1)(1.1)h(n)=h(0)∗h(n−1)+h(1)∗h(n−2)+h(2)∗h(n−3)+...+h(n−1)∗h(0)

递归式背后有什么物理含义呢,这里以出栈序列问题进行说明:

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

含义解释:首先,我们设h(n)h(n)=序列个数为n的出栈序列种数。(我们假定,最后出栈的元素为k,显然,k取不同值时的情况是相互独立的,也就是求出每种k最后出栈的情况数后可用加法原则,由于k最后出栈,因此,在k入栈之前,比k小的值均出栈,此处情况有h(k1)h(k−1)种,而之后比k大的值入栈,且都在k之前出栈,因此有h(nk)h(n−k)种方式,由于比k小和比k大的值入栈出栈情况是相互独立的,此处可用乘法原则,h(nk)h(k1)h(n−k)∗h(k−1)种,求和便是Catalan递归式。

Catalan Number表达式证明

第n个卡特兰数h(n)表达式如下

h(n)=Cn2nn+1=Cn2nCn12n(1.2)(1.2)h(n)=C2nnn+1=C2nn−C2nn−1

具体证明过程如下

为了便于编程实现,需要进一步推导h(n)与h(n-1)之间的关系

已知h(n)h(n),易知

h(n1)=Cn12n2nh(n−1)=C2n−2n−1n

推导 h(n)h(n)的Cn2nC2nn和h(n1)h(n−1)的Cn12n2C2n−2n−1之间的关系,由kCkn=nCk1n1kCnk=nCn−1k−1知
nCn2nCn2nCn2nCn2nCn2nn+1h(n)=2nCn12n1=2Cn12n1=2(2n1)Cn12n2n=2(2n1)h(n1)=2(2n1)n+1h(n1)=2(2n1)n+1h(n1)(1)(2)(3)(4)(5)(6)(1)n∗C2nn=2nC2n−1n−1(2)C2nn=2C2n−1n−1(3)C2nn=2(2n−1)C2n−2n−1n(4)C2nn=2(2n−1)h(n−1)(5)C2nnn+1=2(2n−1)n+1h(n−1)(6)h(n)=2(2n−1)n+1h(n−1)

最终得到h(n)h(n)和h(n1)h(n−1)之间的递归式h(n)=2(2n1)n+1h(n1)h(n)=2(2n−1)n+1h(n−1)

Catalan Number应用实例

括号匹配问题

问题描述: 矩阵连乘 P=A1A2...AnP=A1A2...An,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,问有几种括号化的方案?

问题转换一下就是n对括号的正确匹配方案,可以做一下LeetCode-22

出栈次序问题

问题描述: 一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?

出栈问题问题正是卡特兰数递归式h(n)=h(0)h(n1)+h(1)h(n2)+...+h(n1)h(0)h(n)=h(0)h(n−1)+h(1)h(n−2)+...+h(n−1)h(0)的由来

相关应用问题

  1. 有2n个人排成一行进入剧场,入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)

  2. n个1和n个0组成一个2n位的二进制数,要求从左到右扫描,0的累计数不小于1的累计数,求满足条件的的数。

  3. 12个人排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

    我们先把这12个人从低到高排列,然后,选择6个人排在第一排,那么剩下的6个肯定是在第二排。对问题进行转化:用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,并且任意前缀中0的个数大于等于1的个数就对应一种方案,转化后的问题就是问题2了。

  4. 给定节点组成二叉树的问题:给定n个节点,能构成多少种形状不同的二叉树?

    先取一个点作为顶点,然后左边依次可以取0至n-1个相对应的,右边是n-1到0个,两两配对相乘,就是h(0)h(n1)+h(2)h(n2)+...+h(n1)h(0)=h(n)h(0)∗h(n−1)+h(2)∗h(n−2)+...+h(n−1)h(0)=h(n)能构成h(n)h(n)个,因此二叉树问题也可以解释卡特兰数递归式(1.1)式的由来

  5. n*n棋盘从左下角走到右上角而不穿过主对角线的走法?

    要从左下角走到右上角则必须向上走n步,向右n步,同时为了不跨过主对角线,则走过的步数中向上走的步数必须大于等于向右走的步数,剖析之后发现这个问题与问题3是等价问题,走法有卡特兰数h(n)h(n)种。

    可以做一下下面两题练练手:

    hdoj2067-小兔的棋盘

    LeetCode62-Unique Paths

  6. n个+1和n个-1构成的2n项序列,其部分和总满足:a1+a2+...+an>=0a1+a2+...+an>=0的序列的个数。

    卡特兰数表达式(1.2)式就是以该问题模型为基础推导出来的

猜你喜欢

转载自www.cnblogs.com/dgdg338/p/11729801.html