深入理解卡特兰数及其应用

 更新时间:2013年05月28日 17:49:23   作者:  
本篇文章是对卡特兰数及其应用进行了详细的分析介绍,需要的朋友参考下
Catalan number,卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。
令h(0)=1,h(1)=1,catalan数满足递推式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
catalan数公式的一般是形式为:
                                                         C_n = \frac{1}{n+1}{2n \choose n} = \frac{(2n)!}{(n+1)!n!}

递推关系:

C_0 = 1 \quad \mbox{and} \quad C_{n+1}=\sum_{i=0}^{n}C_i\,C_{n-i}\quad\mbox{for }n\ge 0.

它也满足

C_0 = 1 \quad \mbox{and} \quad C_{n+1}=\frac{2(2n+1)}{n+2}C_n, 
这提供了一个更快速的方法来计算卡塔兰数。

卡特兰数的应用n个元素顺序入栈,出栈顺序有多少种?此问题是一个卡特兰数问题,证明过程如下:

令1表示进栈,0表示出栈,则可转化为求一个2n位、含n个1、n个0的二进制数,满足从左往右扫描到任意一位时,经过的0数不多于1数。显然含n个1、n个0的2n位二进制数共有{2n \choose n}个,下面考虑不满足要求的数目。

考虑一个含n个1、n个0的2n位二进制数,扫描到第2m+1位上时有m+1个0和m个1(容易证明一定存在这样的情况),则后面的0-1排列中必有n-m个1和n-m-1个0。将2m+2及其以后的部分0变成1、1变成0,则对应一个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位数必对应一个不符合要求的数。
因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应。 显然,不符合要求的方案数为c(2n,n+1)。

从而C_n = {2n \choose n} - {2n \choose n + 1} = \frac{1}{n+1}{2n \choose n}。证毕。

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

出栈次序问题  
1、一个栈(无穷大)的进栈序列为1,2,3,..n,有多少个不同的出栈序列?
2、有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)。

将多边行划分为三角形问题  
1、将一个凸多边形区域分成三角形区域的方法数?
2、一位大城市的律师在她住所以北n个街区和以东n个街区处工作。每天她走2n个街区去上班。如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能的道路?
3、在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?

给顶节点组成二叉树的问题  给定N个节点,能构成多少种不同的二叉树?

一些笔试题
1、16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱。16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。
h(8)=16!/(8!*9!)=1430,所以总数=h(8)*8!*8!=16!/9
2、在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,图书馆此时没有了面试宝典了,求他们排队的总数?
h(3)=6!/(3!*4!)=5,所以总数=h(3)*3!*3!=180

相关文章

  • C++ 路径中./、../、/代表的含义

    C++ 路径中./、../、/代表的含义

    这篇文章主要介绍了C++ 路径中./、../、/代表的含义,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • C++标准库封装的vector数组

    C++标准库封装的vector数组

    这篇文章主要介绍了C++标准库封装的vector数组,vector创建的对象包含众多封装好的函数,想了解其相关资料的小伙伴可以参考下面文章内容,希望对你的学习有所帮助
    2022-03-03
  • C++中CopyFile和MoveFile函数使用区别的示例分析

    C++中CopyFile和MoveFile函数使用区别的示例分析

    这篇文章主要介绍了C++中CopyFile和MoveFile函数使用区别的示例分析,CopyFile表示将文件A拷贝到B,如果B已经存在则覆盖,MoveFile表示将文件A移动到。对此感兴趣的可以来了解一下
    2020-07-07
  • C语言用栈模拟实现队列问题详解

    C语言用栈模拟实现队列问题详解

    本片文章带你分析如何用两个栈,并且只使用栈的基本功能来模拟实现队列,其中同样只实现队列的基本功能,感兴趣的朋友来看看吧
    2022-04-04
  • C++浅拷贝与深拷贝及引用计数分析

    C++浅拷贝与深拷贝及引用计数分析

    这篇文章主要介绍了C++浅拷贝与深拷贝及引用计数分析的相关资料,需要的朋友可以参考下
    2017-06-06
  • DHCP:解析开发板上动态获取ip的2种实现方法详解

    DHCP:解析开发板上动态获取ip的2种实现方法详解

    本篇文章是对开发板上动态获取ip的2种实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C语言回调函数的简单运用

    C语言回调函数的简单运用

    回调函数就是函数指针变量作为另外一个函数的参数而使用的一种应用情形。本文就详细的介绍一下C语言回调函数的简单运用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 利用C语言实现五子棋游戏

    利用C语言实现五子棋游戏

    这篇文章主要为大家详细介绍了利用C语言实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C++ 实现桶排序的示例代码

    C++ 实现桶排序的示例代码

    桶排序或所谓的箱排序,是一个排序算法,工作的原理是将数组分到有限数量的桶子,本文详细的介绍了如何实现,感兴趣的可以了解一下
    2021-07-07
  • C语言实现系统关机注销功能

    C语言实现系统关机注销功能

    这篇文章主要为大家详细介绍了C语言实现系统关机注销功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02

最新评论