卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出如今各类计数问题中出现的数列。该数在计算机专业中比较重要,有一些具体的应用实例。这篇文章主要分三部分:php
假设h(0)=1,h(1)=1,catalan数知足递推式:
\[ h(n) = h(0)*h(n-1) + h(1)*h(n-2) + h(2)*h(n-3) + ... +h(n-1)*h(0) \tag{1.1} \]
递归式背后有什么物理含义呢,这里以出栈序列问题进行说明:编程
问题描述:一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不一样的出栈序列?spa
含义解释:首先,咱们设\(h(n)\)=序列个数为n的出栈序列种数。(咱们假定,最后出栈的元素为k,显然,k取不一样值时的状况是相互独立的,也就是求出每种k最后出栈的状况数后可用加法原则,因为k最后出栈,所以,在k入栈以前,比k小的值均出栈,此处状况有\(h(k-1)\)种,而以后比k大的值入栈,且都在k以前出栈,所以有\(h(n-k)\)种方式,因为比k小和比k大的值入栈出栈状况是相互独立的,此处可用乘法原则,\(h(n-k)*h(k-1)\)种,求和即是Catalan递归式。.net
第n个卡特兰数h(n)表达式以下
\[ h(n)=\frac{C_{2n}^{n}}{n+1}=C_{2n}^{n}-C_{2n}^{n-1} \tag{1.2} \]
具体证实过程以下code
为了便于编程实现,须要进一步推导h(n)与h(n-1)之间的关系blog
已知\(h(n)\),易知
\[ h(n-1)=\frac{C_{2n-2}^{n-1}}{n} \]
推导\(h(n)\)的\(C_{2n}^{n}\)和\(h(n-1)\)的\(C_{2n-2}^{n-1}\)之间的关系,由\(kC_{n}^{k}=nC_{n-1}^{k-1}\)知
\[ \begin{align} n*C_{2n}^{n}&=2nC_{2n-1}^{n-1} \\ C_{2n}^{n}&=2C_{2n-1}^{n-1} \\ C_{2n}^{n}&=2\frac{(2n-1)C_{2n-2}^{n-1}}{n} \\ C_{2n}^{n}&=2(2n-1)h(n-1) \\ \frac{C_{2n}^{n}}{n+1}&=\frac{2(2n-1)}{n+1}h(n-1) \\ h(n)&=\frac{2(2n-1)}{n+1}h(n-1) \end{align} \]
最终获得\(h(n)\)和\(h(n-1)\)之间的递归式\(h(n)=\frac{2(2n-1)}{n+1}h(n-1)\)递归
问题描述: 矩阵连乘 \(P=A_1A_2...A_n\),依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,问有几种括号化的方案?leetcode
问题转换一下就是n对括号的正确匹配方案,能够作一下LeetCode-22get
问题描述: 一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不一样的出栈序列?数学
出栈问题问题正是卡特兰数递归式\(h(n)=h(0)h(n-1)+h(1)h(n-2)+...+h(n-1)h(0)\)的由来
有2n我的排成一行进入剧场,入场费5元。其中只有n我的有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视做将5元入栈,持10元者到达视做使栈中某5元出栈)
n个1和n个0组成一个2n位的二进制数,要求从左到右扫描,0的累计数不小于1的累计数,求知足条件的的数。
12我的排成两排,每排必须是从矮到高排列,并且第二排比对应的第一排的人高,问排列方式有多少种?
咱们先把这12我的从低到高排列,而后,选择6我的排在第一排,那么剩下的6个确定是在第二排。对问题进行转化:用0表示对应的人在第一排,用1表示对应的人在第二排,那么含有6个0,6个1的序列,而且任意前缀中0的个数大于等于1的个数就对应一种方案,转化后的问题就是问题2了。
给定节点组成二叉树的问题:给定n个节点,能构成多少种形状不一样的二叉树?
先取一个点做为顶点,而后左边依次能够取0至n-1个相对应的,右边是n-1到0个,两两配对相乘,就是\(h(0)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(0)=h(n)\)能构成\(h(n)\)个,所以二叉树问题也能够解释卡特兰数递归式(1.1)式的由来
n*n棋盘从左下角走到右上角而不穿过主对角线的走法?
要从左下角走到右上角则必须向上走n步,向右n步,同时为了避免跨过主对角线,则走过的步数中向上走的步数必须大于等于向右走的步数,剖析以后发现这个问题与问题3是等价问题,走法有卡特兰数\(h(n)\)种。
能够作一下下面两题练练手:
n个+1和n个-1构成的2n项序列,其部分和总知足:\(a_1+a_2+...+a_n>=0\)的序列的个数。
卡特兰数表达式(1.2)式就是以该问题模型为基础推导出来的
参考连接: