什么是catalan数?
在网上找了n久,各种关于catalan数列的资料都残缺不堪,弄了半天才理解什么是catalan数。所以干脆自己梳理一番。
t_4acd74e802000azp.pngt_4acd74e802000azp.png
原理:
令h(1)=1,catalan数满足递归式:
h(n)= h(1)*h(n-1) + h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=2)
该递推关系的解为:h(n)=c(2n-2,n-1)/n (n=1,2,3,...)

我并不关心其解是怎么求出来的,我只想知道怎么用catalan数分析问题。
我总结了一下,最典型的三类应用:(实质上却都一样,无非是递归等式的应用,就看你能不能分解问题写出递归式了)
1.括号化问题。

矩阵链乘: P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)

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

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

3.将多边行划分为三角形问题。
将一个凸多边形区域分成三角形区域的方法数?

类似:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果他
从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?

类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

不过下面这个问题似乎不好归类,它怎么来应用这个catalan递归方程呢?你说说:n个结点可构造多少个不同的二叉树?

看的人倒是不少,愿意想一想的倒是不多,唉

Catalan numbers

posted on 2006-11-06 16:39 哈哈 阅读(3847) 评论(16)  编辑 收藏 引用

评论:
# re: catalan数在数据结构中的应用 2006-11-10 12:56 | 江水兽
h(n)=c(2n-2,n-1)/n 是什么意思哈 C代表什么呀  回复  更多评论
  
# re: catalan数在数据结构中的应用 2006-11-10 12:57 | 江水兽
顺便说一下啊

你的浏览计数器太大了 影响页面访问和美观 呵呵呵 随便提个建议  回复  更多评论
  
# re: catalan数在数据结构中的应用 2006-11-10 13:11 | pengkuny
@江水兽
c代表组合数,即2n-2个体种选取n-1个的种类  回复  更多评论
  
# re: catalan数在数据结构中的应用 2006-11-10 13:12 | pengkuny
@江水兽
谢谢啊
不过字体设置到最小后,还是这么大,let it be  回复  更多评论
  
# re: catalan数在数据结构中的应用 2006-11-10 13:19 | 江水兽
不过好像有些问题还不是那么好处理呵

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

到底该如何利用类推法呢?

假如用f(x)来表示x个人时的情况,
那么一个人时f(1)=1;
两个人时f(2)=2f(1)+1;
三个人时f(3)=3f(1)+f(2)f(1)+f(1)f(2);
四个人时f(4)=4f(1)+2f(3)f(1)+f(2)f(2)+f(1)f(2)f(1);
……
这样貌似还是有点不好处理呀……  回复  更多评论
  
# re: catalan数在数据结构中的应用 2006-11-10 13:39 | pengkuny
@江水兽
你是说这么递归解这一堆递归式吧.
大可不必,
我们只需要发现一个问题满足catalan数列的递归式,然后直接就可以得到解
f(n)=h(n)=c(2n-2,n-1)/n
有时候还要看具体问题,可能最终的解是h(n+1)或h(n-1)或h(2n)等等  回复  更多评论
  
# re: catalan数在数据结构中的应用 2006-11-10 17:22 | 江水兽
@pengkuny
好像有道理哟 我再看看!  回复  更多评论
  
# re: catalan数在数据结构中的应用[未登录] 2007-05-16 12:40 | yiyi
应该是C(n)种吧
C(n)=(2n)!/[n!*(n+1)!]  回复  更多评论
  
# re: catalan数在数据结构中的应用[未登录] 2007-05-16 12:42 | yiyi
应该是C(n)种吧
C(n)=(2n)!/[n!*(n+1)!]  回复  更多评论
  
# re: catalan数在数据结构中的应用 2007-05-30 11:44 | skyking
我想知道catalan数是怎样推导出来的呀
怎样用于算法的分析呀  回复  更多评论
  
# re: catalan数在数据结构中的应用 2007-07-18 20:44 | Menie
ding~~
好文啊,这几个都很典型!  回复  更多评论
  
# re: catalan数在数据结构中的应用 2007-07-18 21:05 | Menie
对于每一个数来说,必须进栈一次、出栈一次。我们把进栈设为状态‘1’,出栈设为状态‘0’。n个数的所有状态对应n个1和n个0组成的2n位二进制数。由于等待入栈的操作数按照1‥n的顺序排列、入栈的操作数b大于等于出栈的操作数a(a≤b),因此输出序列的总数目=由左而右扫描由n个1和n个0组成的2n位二进制数,1的累计数不小于0的累计数的方案种数。
在2n位二进制数中填入n个1的方案数为c(2n,n),不填1的其余n位自动填0。从中减去不符合要求(由左而右扫描,0的累计数大于1的累计数)的方案数即为所求。

不符合要求的数的特征是由左而右扫描时,必然在某一奇数位2m+1位上首先出现m+1个0的累计数和m个1的累计数,此后的2(n-m)-1位上有n-m个1和n-m-1个0。如若把后面这2(n-m)-1位上的0和1互换,使之成为n-m个0和n-m-1个1,结果得1个由n+1个0和n-1个1组成的2n位数,即一个不合要求的数对应于一个由n+1个0和n-1个1组成的排列。
反过来,任何一个由n+1个0和n-1个1组成的2n位二进制数,由于0的个数多2个,2n为偶数,故必在某一个奇数位上出现0的累计数超过1的累计数。同样在后面部分0和1互换,使之成为由n个0和n个1组成的2n位数,即n+1个0和n-1个1组成的2n位数必对应一个不符合要求的数。显然,不符合要求的方案数为c(2n,n+1)。由此得出
输出序列的总数目=c(2n,n)-c(2n,n+1)=1/(n+1)*c(2n,n)。


(form 日照NOIP夏令营,by 王建德老师)  回复  更多评论
  
# re: catalan数在数据结构中的应用 2007-07-31 11:55 | etfl
问题条件MS都不太清楚,可不可以说明白一点?

比如
3.将多边行划分为三角形问题。
将一个凸多边形区域分成三角形区域的方法数?

划分线是否可以相交?如果不可以相交那结果应该是catalan数,如果可以相交那就得另当别论了。

再问一句,为什么c(2n,n)-c(2n,n+1)=1/(n+1)*c(2n,n)?  回复  更多评论
  
# re: catalan数在数据结构中的应用 2007-08-12 21:14 | binyun714
输出前n个catalan数:
program jk;
const maxn=1000;
type arraytype=array[0..maxn] of longint;
var i,j,n:longint;

procedure mul(var h:arraytype;k:longint);
var i:longint;
begin
for i:=0 to maxn do h[i]:=h[i]*k;
for i:=0 to maxn-1 do
begin
h[i+1]:=h[i+1]+h[i] div 10;
h[i]:=h[i] mod 10
end
end;

procedure devide(var h:arraytype;k:longint);
var d,i,r:longint;
begin
r:=0;
for i:=maxn downto 0 do
begin
d:=10*r+h[i];
h[i]:=d div k;
r:=d mod k
end
end;
procedure cat(n:integer);
var i,j:integer;
h:arraytype;
begin
for i:=1 to maxn do h[i]:=0;
h[0]:=1;
for i:=3 to n-1 do
begin
mul(h,4*i-6);
devide(h,i)
end;
i:=maxn;
while (i>0) and (h[i]=0) do i:=i-1;
for j:=i downto 0 do write(h[j]);
writeln;
end;

begin
assign(input,'input.dat');reset(input);
assign(output,'output.dat');rewrite(output);
readln(n);
n:=n+2;
for i:=1 to n do cat(i);
close(input);close(output);
end.
  回复  更多评论
  
# re: catalan数在数据结构中的应用 2007-08-19 14:38 | 忧郁的鱼
对于有n个节点可构成几棵不同形态的二叉树,可以这么考虑:
因为只有一个根节点,而且二叉树只有左孩子或右孩子,所以可知:
当左孩子有0个节点时,右孩子有n-1个节点,可构成的不同形态二叉树的数目为:
h(0)*h(n-1)
当左孩子有1个节点时,右孩子有n-2个节点,可构成的不同形态二叉树的数目为:
h(1)*h(n-2)
当左孩子有2个节点时,右孩子有n-3个节点,可构成的不同形态二叉树的数目为:
h(2)*h(n-3)
依次类推:
可知共有不同形态二叉树的数目为:
h(0)*h(n-1)+h(1)*h(n-2)+h(2)*h(n-3)...+h(n-1)*h(0)
注:h(0)=1,h(1)=1,h(2)=2 h(3)=5  回复  更多评论
  
# re: catalan数在数据结构中的应用[未登录] 2009-06-07 10:31 | wolf
内容有错误,别人又来复制,导致错误的事情扩大,可悲。。。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理