[组合数学] T3 卡特兰数

T3 / 卡特兰数

学习一下卡特兰数

卡特兰数实际上就是一大类问题划归得到的一个结论
其通式:
Hn=(2nn)n+1 (n2,nN) H_n=\frac{\binom{2n}{n}}{n+1}\ (n\geq 2,n\in N^*)
递推式:
Hn={1n=0,1i=0n1HiHni1n2,nN+ H_n=\left\{ \begin{aligned} &1&&n=0,1\\ &\sum_{i=0}^{n-1}H_{i}H_{n-i-1} &&n\geq 2,n\in N_+\\ \end{aligned} \right.
下式还可写作i=1nHi1Hni\sum_{i=1}^nH_{i-1}H_{n-i},总之两下标和为n1n-1的两数卷起来

数列前几项:
Hn=1,1,2,5,14,42, H_n=1,1,2,5,14,42,\cdots

两式互相转化不易证,咕

一些例子

非降路径计数

求从原点走到在平面直角座标系上的y=xy=x直线上的整点的方案数,且只能向上或向右走

打表发现数列符合1,1,2,5,1,1,2,5,\cdots,于是卡特兰

入栈顺序由1到n,求所有可能的出栈顺序的总数

法一:打表观察,发现数列符合1,1,2,5,1,1,2,5,\cdots
法二:考虑nn入栈的时机,前n1n-1个数出栈i,i[0,n1]i,i\in [0,n-1]个后进入,那么已出栈数列的方案数为aia_i,加入nn后数列的出栈方案数为ani1a_{n-i-1},由于前n1n-1个数随意组合,考虑乘法原理:
an=i=0n1aiani1 a_n=\sum_{i=0}^{n-1}a_{i}a_{n-i-1}
故为卡特兰数列

二叉树计数

求有nn个节点的(无标号)二叉树的种数

对于有nn个节点的(无标号)二叉树,考虑一个根节点,左儿子有i,i[0,n1]i,i\in[0,n-1]个节点,右儿子则有ni1n-i-1个节点,考虑乘法原理:
Sn=i=0n1SiSni1 S_n=\sum_{i=0}^{n-1}S_iS_{n-i-1}
故为卡特兰数列

T3 概率论

对于一棵随机生成的nn个结点的有根二叉树(所有互相不同构的形态等概率出现),它的叶子节点数的期望是多少呢?

考虑树个数,由上文知为卡特兰数列,树个数记为fif_i
记树叶子节点数为gig_i

考虑nn个结点的二叉树的得到:由n1n-1个结点的二叉树加上一个叶子节点得来
不同的n1n-1二叉树上加的叶子节点是不一样的,如:
在这里插入图片描述

所以gi=nfi1g_i=nf_{i-1}

于是期望:
E=gifi=nfi1fi=n(2n2n1)n(2nn)n+1=n(n+1)2(2n1) \begin{aligned} E&=\frac{g_i}{f_i}\\ &=\frac{nf_{i-1}}{f_i}\\ &=\frac{n\frac{\binom{2n-2}{n-1}}{n}}{\frac{\binom{2n}{n}}{n+1}}\\ &=\frac{n(n+1)}{2(2n-1)} \end{aligned}

Prod概率论

#include<bits/stdc++.h>
using namespace std;

int main(){
	double n;
	scanf("%lf",&n);
	n=n*(n+1)/(2*(2*n-1));
	printf("%.9lf",n);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章