对卡塔兰数的理解

Posted lidan-prime

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对卡塔兰数的理解相关的知识,希望对你有一定的参考价值。

卡塔兰数定义

f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-1)f(0)

      = f(k-1)f(n-k) k=1...n

以k为轴划分子问题,左边子问题的解的个数和右边子问题的解的个数是原问题以k为轴的解法的2个独立步骤,适用乘法原理

分别以1,2,。。。n为轴,是原问题的n种解法,适用加法原理。

 

与卡塔兰数有关问题通常满足如下描述:有一个大问题A,规模为n,要解决这个问题,可以用分治的思想,首先固定其中某一个元素,将剩下的n-1个元素拆分成两个小问题,这两个小问题的规模分别是(0,n-1) (1,n-2) (2,n-3) ... (n-1,0)

举几个例子:
1. 二叉树计数,n个结点的二叉树,首先固定根节点,将剩下的n-1个结点拆分给左右子树
2. 三角形划分问题,凸(n+2)边形可以划分为n个三角形,首先固定一条边(即一个三角形),这个三角形将这个(n+2)边形拆分成两个更小的多边形。

 

有关卡塔兰数详细的数学证明,性质和应用,查阅维基百科卡塔兰数

 

有关卡塔兰数的几何证明(折线),参考某博主的博客卡塔兰数

 

下面是一个简单的卡塔兰数应用:

技术分享图片

 

 

 

就跟斐波那契数列一样,我们把n = 0 时赋为1,因为空树也算一种二叉搜索树,那么n = 1时的情况可以看做是其左子树个数乘以右子树的个数,左右字数都是空树,所以1乘1还是1。那么n = 2时,由于1和2都可以为跟,分别算出来,再把它们加起来即可。n = 2的情况可由下面式子算出:

dp[2] =  dp[0] * dp[1]   (1为根的情况)

    + dp[1] * dp[0]    (2为根的情况)

同理可写出 n = 3 的计算方法:

dp[3] =  dp[0] * dp[2]   (1为根的情况)

    + dp[1] * dp[1]    (2为根的情况)

      + dp[2] * dp[0]    (3为根的情况)

 

 

 

 

 

 

技术分享图片

 



以上是关于对卡塔兰数的理解的主要内容,如果未能解决你的问题,请参考以下文章

NYOJ 164

谁有卡特兰数的证明过程?

LeetCode(96): 不同的二叉搜索树

浅谈求卡特兰数的几种方法

求解Catalan数,(大数相乘,大数相除,大数相加)

Catalan数