卡特兰数 java,卡特兰数(Catalan Number)及其应用

定义

卡特兰数是一个常出现在各种计数问题中的数列, 其满足的递推方程如下:

$$C(n) = \sum_{k=0}^{n-1} C(k) \times C(n-1-k), n \gt 0$$

令初始值$C(0) = 1$,则其前几项为:1, 1, 2, 5, 14, 42...

其通项公式有多种写法,如用生成函数法可以直接由以上递推方程求出,这里暂且不表,仅取一种简洁且易于计算的形式:

$$C(n) = \frac{1}{n+1}\binom{2n}{n}$$

卡特兰的增长速度为指数级,渐进公式为:

$$ C(n) \approx \frac{4^n}{n^{3/2}\sqrt{\pi}} $$

应用

卡特兰数可以应用于许多有趣的组合数学问题及CS中的计数问题,列举其中部分:

n个数共有多少种不同的出栈序列? -- C(n).

n对括号共有多少种合法配对形式?e.g., n = 2,()(), (()) -- C(n).

给n+1个相乘的数(或者矩阵)加括号,e.g., n=2, ((ab)c), (a(bc)). 共有多少种方法? --- C(n).

有n个节点的二叉树(问二叉搜索树(BST)也一样), 有多少种不同构成形式?-- C(n).

有n+1个叶子结点的满二叉树,共有多少种? -- C(n). 1460000021667360

将凸n+2边形以不相交的对角线分割为n个三角形,共有多少种方法? -- C(n).

n个-1和n个1构成的序列中,满足任意前缀和都大于0的有多少种? -- C(n). 这个问题可以将-1看成入栈,1看成出栈,前缀和大于0的序列等价于出栈序列.

n*n的方格中从左下角的A点走到右上角的B的点,不穿过对角线的单调路径有多少种? --C(n). 这也是一个导出catalan数公式的典型示例。1460000021667359

由此衍生出许多问题,通常都可以写出定义中的递推方程。如一道笔试题:

在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数?

-- 类似例题7,由C(3)=5,但注意组合的问题都认为物品是相同的,这里还要考虑3个不同的人的排列,因此总数: 5 * 3!* 3! = 180.

计算

现在上code来计算第n个组合数$C(n)$. 分别从递推公式和通项公式出发有两种方法:

动态规划

根据递推公式很容易写出动规算法,在忘记通项公式的时候可以直接使用,大多数情况不会超时。如leetcode 96.Unique binary search trees.

int catalan(int n) {

vector dp(n+1, 0);

for (int i = 1; i <= n; ++i)

for (int j = 0; j <= i - 1; ++j)

dp[i] += dp[j] * dp[i-1-j];

return dp[n];

}

时间复杂度:$O(n^2)$

空间复杂度:$O(n)$

计算组合数

如果记得通项公式,那么直接计算组合数更快,利用我在另一篇文章中提到的方法compute_binomial 可以在O(n)时间完成.

int catalan(int n) {

return compute_binomial(2*n, n) / (n+1);

}

时间复杂度:$O(n)$

空间复杂度:$O(1)$

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值