catalan
- 格式:docx
- 大小:31.23 KB
- 文档页数:5
catalan常数
Catalan常数,又称为卡塔兰常数,是数学领域中一个具有重要地位的数字。
这个常数的值约为0.915Catalan常数,又称为卡塔兰常数,是数学领域中一个具有重要地位的数字。
这个常数的值约为0.***,且其计算公式为:
G = 1 + 1/2 + 1/3 + 1/4 + ... + 1/n
其中n代表任意正整数。
尽管这个公式看似简单,但它在组合数学、概率论以及许多其他数学领域中都扮演着重要的角色。
Catalan常数的发现和应用可以追溯到19世纪初,比利时数学家欧仁·夏斯乐(Eugène Charles Catalan)研究了这个问题并首次提出了它的一般公式。
此后,这个常数一直受到数学家们的广泛关注。
在组合数学中,Catalan常数常常用来计算各种组合问题的解。
例如,它可以用来计算二叉树的计数、括号匹配的数量、有理二次型的整数解等。
在概率论中,Catalan常数与某些随机事件的概率分布有关。
例如,它在计算等概率情况下的等待时间、排队论中等待时间等问题中发挥着重要作用。
此外,Catalan常数还在计算机科学、物理、生物等领域有所应用。
总的来说,Catalan常数是一个充满魅力且具有广泛应用的数学常数,吸引着无数数学家们去探索和研究。
用100种语言说“我爱你”1. English (英语)- I love you2. Afrikaans (南非地方语言)- Ek het jou lief3. Albanian (阿尔巴尼亚语)- Te dua4. Arabic (阿拉伯语)- Ana behibak (给予男性), Ana behibek (给予女性)5. Armenian (亚美尼亚语)- Yes kez sirumen6. Bambara - M'bi fe7. Bangla (孟加拉语)- Aamee tuma ke bhalo aashi8. Belarusian(白俄罗斯语)- Ya tabe kahayu9. Bisaya (菲律宾地方语言)- Nahigugma ako kanimo10. Bulgarian (保加利亚语)- Obicham te11. Cambodian (柬语)- Soro lahn nhee ah12. Cantonese Chinese (粤语)- Ngo oiy ney a13. Catalan (西班牙地方语言)- T'estimo14. Cheyenne (美国印地安语言)- Ne mohotatse15. Chichewa - Ndimakukonda16. Corsican (法属地中海岛屿地方语言)- Ti tengu caru (给予男性)17. Creole - Mi aime jou18. Croatian (克罗地亚语)- V olim te19. Czech (捷克语)- Miluji te20. Danish (丹麦语)- Jeg Elsker Dig21. Dutch (荷兰语)- Ik hou van jou22. Esperanto (世界语)- Mi amas vin23. Estonian (埃莎尼亚语)- Ma armastan sind24. Ethiopian (埃塞尔比亚语)- Afgreki'25. Faroese (丹麦属法罗尔群岛地方语言)- Eg elski teg26. Farsi (波斯语)- Doset daram27. Filipino (菲律宾语)- Mahal kita28. Finnish (芬兰语)- Mina rakastan sinua29. French (法语)- Je t'aime, Je t'adore30. Gaelic (苏格兰地方语言)- Ta gra agam ort31. Georgian (格鲁吉亚语)- Mikvarhar32. German (德语)- Ich liebe dich33. Greek (希腊语)- S'agapo34. Gujarati (印度地方语言)- Hoo thunay prem karoo choo35. Hiligaynon - Palangga ko ikaw36. Hawaiian (夏威宜地方语言)- Aloha wau ia oi37. Hebrew (稀柏莱语)- Ani ohev otah (给予女性), Ani ohev et otha (给予男性)38. Hiligaynon - Guina higugma ko ikaw39. Hindi (兴地语)- Hum Tumhe Pyar Karte hae40. Hmong - Kuv hlub koj41. Hopi - Nu' umi unangwa'ta42. Hungarian (匈牙利语)- Szeretlek43. Icelandic (冰岛语)- Eg elska tig44. Ilonggo - Palangga ko ikaw45. Indonesian (印尼语)- Saya cinta padamu46. Inuit (格林兰岛地方语言)- Negligevapse47. Irish (爱尔兰语)- Taim i' ngra leat48. Italian (意大利语)- Ti amo49. Japanese (日本语)- Ai****eru50. Kannada (印度地方语言)- Naanu ninna preetisuttene51. Kapampangan (菲律宾地方语言)- Kaluguran daka52. Kiswahili (非洲语言)- Nakupenda53. Konkani (印度地方语言)- Tu magel moga cho54. Korean (韩语)- Sarang Heyo55. Latin (拉丁语)- Te amo56. Latvian (拉托维亚语)- Es tevi miilu57. Lebanese (黎巴嫩语)- Bahibak58. Lithuanian (立陶宛语)- Tave myliu59. Malay (马来语)- Saya cintakan mu / Aku cinta padamu60. Malayalam (印度地方语言)- Njan Ninne Premikunnu61. Mandarin Chinese (中文)- Wo ai ni62. Marathi (印度地方语言)- Me tula prem karto63. Mohawk - Kanbhik64. Moroccan (摩洛哥语)- Ana moajaba bik65. Nahuatl - Ni mits neki66. Navaho - Ayor anosh'ni67. Norwegian (挪威语)- Jeg Elsker Deg68. Pandacan - Syota na kita!!69. Pangasinan - Inaru Taka70. Papiamento - Mi ta stimabo71. Pig Latin - Iay ovlay ouyay72. Polish (波兰语)- Kocham Ciebie73. Portuguese (葡萄牙语)- Eu te amo74. Romanian (罗马尼亚语)- Te ubesk75. Russian (俄罗斯语)- Ya tebya liubliu76. Scot Gaelic (苏格嫉胤接镅裕? Tha gra\dh agam ort77. Serbian (塞尔维亚语)- V olim te78. Setswana - Ke a go rata79. Sign Language (手语)- ,\,,/ (represents position of fingers when signing'I Love You')80. Sindhi (巴基斯坦地方语言)- Maa tokhe pyar kendo ahyan81. Sioux - Techihhila82. Slovak (斯洛伐克语)- Lu`bim ta83. Slovenian (斯洛文尼亚语)- Ljubim te84. Spanish (西班牙语)- Te quiero / Te amo85. Swahili (非洲地方语言)- Ninapenda wewe86. Swedish (瑞典语)- Jag alskar dig87. Swiss-German (瑞士德语)- Ich lieb Di88. Taiwanese (台语)- Wa ga ei li89. Tahitian (大希地地方语言)- Ua Here Vau Ia Oe90. Tamil (印度地方语言)- Nan unnai kathalikaraen91. Telugu (印度地方语言)- Nenu ninnu premistunnanu92. Thai (泰语)- Chan rak khun (to male), Phom rak khun (to female)93. Turkish (土尔其语)- Seni Seviyorum94. Ukrainian (乌克兰语)- Ya tebe kahayu95 .Urdu (印度地方语言)- mai aap say pyaar karta hoo96. Vietnamese (越南语)- Anh ye^u em (给予女性), Em ye^u anh (给予男性)97. Welsh (威尔士语)- 'Rwy'n dy garu98. Yiddish - Ikh hob dikh99. Yoruba - Mo ni fE100. Chinese (汉语)- 我爱你。
4.5 Fibonacci 数和Catalan 数Fibonacci 数列和Catalan 数列是递推关系的典型问题,它们经常出现在组合计数问题中,而这两个数列本身的应用也十分广泛。
4.5.1 Fibonacci 数关于Fibonacci 数列的问题是一个古老的数学问题,它是由意大利著名数学家Fibonacci 于1202年提出来的。
这个问题是:把一对兔子(雌、雄各一只)在某年的开始放到围栏中,每个月这对兔子都生出一对新兔子,其中雌、雄各一只。
从第二个月开始,每对新兔子每个月也生出一对新兔子,也是雌、雄各一只。
问一年后围栏中有多少对兔子?对于1,2,n = ,令()f n 表示第n 个月开始时围栏中的兔子对数。
显然有()()11,22f f ==。
在第n 个月的开始,那些第1n -个月初已经在围栏中的兔子仍然存在,而且每对在第2n -个月初就存在的兔子将在第1n -个月生出一对新兔子,所以有()()()()()()12311,22f n f n f n n f f =-+-≥⎧⎪⎨==⎪⎩ (4.5.1)这是一个带有初值的递推关系,如果我们规定()01f =,则递推关系(4.5.1)就变成()()()()()()12201,11f n f n f n n f f =-+-≥⎧⎪⎨==⎪⎩ (4.5.2)满足递推关系(4.5.2)的数列就叫做Fibonacci 数列,它的项就叫做Fibonacci 数。
下面我们来求解这个递推关系,它的特征方程为210x x --=其特征根为12x x ==所以,通解为()121122n nf n c c ⎛⎛+=+ ⎝⎭⎝⎭代入初值来确定1c 和2c ,得到方程组12121,11122c c c +=⎧⎪⎨++=⎪⎩ 解这个方程组,得121,212cc+==所以,原递推关系的解为()()110,1,2n nf nn++=⎭⎭=Fibonacci数常出现在组合计数问题中。
Catalan数,括号序列和栈全是⼊门的⼀些东西.基本全是从别处抄的.栈: ⽀持单端插⼊删除的线性容器. 也就是说,仅允许在其⼀端加⼊⼀个新元素或删除⼀个元素. 允许操作的⼀端也叫栈顶,不允许操作的⼀端也叫栈底.数个箱⼦相叠就可以认为是⼀个栈,只能在最顶端加⼊⼀个新箱⼦或拿⾛⼀个箱⼦.栈中的元素遵循后进先出(last in first out,LILO)的规律.即:更早出栈的元素,应为更早⼊栈者.这是⼀个演⽰:奇数⾏为栈中元素(右端可以进⾏插⼊删除),元素以逗号隔开, EMPTY表⽰栈为空偶数⾏为进⾏的操作EMPTY插⼊1010插⼊2010,20插⼊5110,20,51插⼊1010,20,51,10删除⼀个元素10,20,51删除⼀个元素10,20插⼊3010,20,30删除⼀个元素10,20删除⼀个元素10删除⼀个元素EMPTY栈混洗问题给出三个栈S1,S2,S3,⼀开始S1中含有1到n的n个数字且从栈顶到栈底数字依次为1,2,3,....n-1,n.只有两种允许的操作:A S1⾮空时从S1取出⼀个元素放⼊S2,B S2⾮空时可以从S2取出⼀个元素放⼊S3.最后S3中⾃底向上形成的序列称作⼀个栈混洗.例如,如果S1中⼀开始有1,2,3,4四个元素,那么先进⾏4次A操作再进⾏4次B操作,将得到序列4,3,2,1.如果A操作和B操作交替进⾏,将得到序列1,2,3,4.显然,栈混洗的结果并不唯⼀.⼀个长为n的序列的栈混洗可以表⽰成n次A操作和n次B操作组成的⼀个操作序列. ⽽n次A操作和n次B操作组成的⼀个操作序列也可以表⽰唯⼀的⼀个栈混洗序列.不同的操作序列必然得到不同的栈混洗,不同的栈混洗也必然对应不同的操作序列.并不是所有含有n个A,n个B的序列都是合理的操作序列.例如BBBBAAAA,将导致我们尝试拿出空栈S2中的元素.⼀个序列合理的条件是:对于任意m(1<=m<=2n),该序列的前m个操作中,B操作的数⽬不超过A操作的数⽬.只要满⾜这个条件就能保证任意时刻不会拿出空栈中的元素.如何判断⼀个栈混洗序列是否是可能出现的栈混洗序列例如,对于序列1,2,3,通过栈混洗可以得到[1,2,3],[3,2,1],[1,3,2],[2,1,3],[2,3,1],但是⽆法得到[3,1,2].如果使3最先出栈,那么就必须先令1,2⼊栈,从⽽2会在1之前出栈,只能得到[3,2,1]任意给出⼀个n和⼀个排列,如何判断这个排列能否通过栈混洗得到?例如,n=5,序列为5,4,1,3,2,是否可能?直接的思路是,直接根据我们要得到的序列,尝试进⾏A操作和B操作.例如,n=5时,要使序列的第⼀个元素为5,就必须⼀直进⾏A操作直到5出现在S2的栈顶.之后需要4,4恰好在S2的栈顶,于是弹出4.接下来需要的1不在栈顶,因此这个序列⽆法通过栈混洗得到.时间复杂度显然为O(n).其正确性也是显然的.栈混洗与括号序列⾸先只考虑由⼀种括号组成的括号序列.()()()(),(()())(),((()))都是能够匹配的括号序列.)(,))(,())(都是不能够匹配的括号序列.只要将A操作与左括号"("对应,B操作与右括号")"对应,栈混洗的合法操作序列就可以和能够匹配的括号序列⼀⼀对应.例如,AABB对应(()),ABAB对应()()按照我们之前的理解,如果保证序列中左右括号数⽬相同,那么我们只需要扫描⼀遍序列并维护⼀个计数器,初始为0,遇到左括号+1,遇到右括号-1,只要这个计数器的数值始终⾮负,就说明任意⼀个前缀中左括号的数⽬多于右括号的数⽬,等价于这个序列是能够匹配的括号序列.另⼀种判断括号序列是否合法的⽅法:初始化⼀个空栈S,从左向右扫描序列,遇到⼀个左括号将其⼊栈,遇到⼀个右括号时判断栈中是否有⼀个左括号,如果有,那么这个左括号与当前遇到的右括号相匹配.如果栈为空,那么这个括号序列并不合法.通过这种⽅式,我们除了得知括号序列是否合法,还可以得知每个右括号具体是和哪个左括号匹配,还可以处理序列中出现了多种括号且只有对应种类的括号能匹配的情况.可以⾃⾏尝试,"维护⼀个计数器"的⽅式并不能⽅便地扩展到多种括号的情况.拓展:允许循环移位的合法括号序列允许将括号序列的最左侧元素拿到最右边,问能否通过若⼲次这样的操作使得括号序列合法.⾸先这样的序列仍然需要满⾜左括号和右括号数⽬相同. 但是除此之外还需要满⾜什么条件呢?令⼈惊讶的是,除此之外并不需要满⾜什么条件.只要左括号和右括号数⽬相同,就可以保证能够通过若⼲次循环移位使得括号序列合法.给出⼀个构造⽅式:将左括号视为1,右括号视为-1,求取该序列的前缀和.如果前缀和中的最⼩值为0那么序列本⾝就是合法的.否则我们找到前缀和的最⼩值的出现位置(多个数值相同时取最左侧的),将这个位置之前的⼀段序列移位到右端,得到的即为合法的括号序列.构造⽅式的正确性不难证明.括号序列计数有多少个不同的含有n对括号的合法括号序列?这个问题等价于通过栈混洗可以得到多少个不同序列.也等价于,有多少个含有n个0,n个1的长为2n的字符串使得任意⼀个前缀中1的数⽬不少于0的数⽬.假设答案为f[n].边界条件为f[0]=1,表⽰没有括号/没有元素时也算有⼀种⽅案(空串也是⼀种合法序列).插播两条⾼中数学:分类加法计数原理:做⼀件事有m类⽅法,每类⽅法分别有A1,A2...Am种做法,那么做这件事共有A1+A2+...+Am种⽅法分步乘法计数原理:做⼀件事有m个步骤,每个步骤分别有A1,A2...Am种做法,那么做这件事共有A1∗A2∗...∗Am种⽅法好了,接下来我们来将所学的⽤于实践.考虑最左侧的左括号匹配的右括号在什么位置.假设这个左括号和匹配的右括号之间有2i个括号(这个数⽬必须是偶数),这2i个括号排列成合法括号序列的⽅案数为f[i].匹配的右括号右边还有2n-2i-2个括号,将它们排列为合法括号序列的⽅案数为f[n-i-1],这两部分可以认为是两个步骤,是独⽴的,那么总的⽅案数是f[i]*f[n-i-1].对于不同的i,我们可以认为是做⼀件事的不同种类的⽅法.于是f[1]=f[0]∗f[0],f[2]=f[1]∗f[0]+f[0]∗f[1],f[3]=f[0]∗f[2]+f[1]∗f[1]+f[2]∗f[0],这是⼀个O(n^2)的计算⽅式.这⾥我们得到的f[n]也叫Catalan数(卡特兰数),它还具有很多实际意义.紫书330~331页给出了Catalan数的另⼀个实际意义:多边形三⾓剖分数⽬,并通过另⼀个O(n^2)的递推公式,推倒了O(n)的递推公式.另⼀个常⽤的计算公式是f[n]=C(2n,n)/(n+1)=C(2n,n) - C(2n,n-1),C(2n,n)为组合数.catalan数的⼀个推⼴:n个左括号,m个右括号,任意前缀中左括号不少于右括号的序列数?答案是C(n+m,m)-C(n+m,m-1).Processing math: 100%。
catalan数和逆序数的关系Catalan数和逆序数是组合数学中两个经典的问题,它们之间存在着密切的关联。
下面将从Catalan数与逆序数的定义出发,分别介绍它们的特点和性质,最后讨论两者之间的关系。
首先,我们首先来介绍一下Catalan数。
Catalan数是组合数学中一系列以比利时数学家欧仁·查理·卡塔兰(Eugène Charles Catalan)的名字命名的数列,记作C_n。
它是一个自然数数列,从n=0开始,其前几项依次为1, 1, 2, 5, 14, 42, 132, 429, ...。
Catalan数在组合数学、代数、图论等领域中都有广泛而重要的应用。
Catalan数的递推公式如下:C_0 = 1C_n = (2(2n-1)/(n+1)) * C_{n-1},其中n ≥ 1其生成函数表示为:C(x) = C_0 + C_1*x + C_2*x^2 + C_3*x^3 + ...逆序数,也被称为逆序对,是一个在排列中的概念,表示排列中所有逆序对的个数。
在一个排列中,如果某两个数的前后位置与它们在原排列中的前后位置相反,即前面的数比后面的数大,那么就称这两个数是一个逆序对。
逆序数常常用来描述排列的有序性和混乱程度。
逆序数的定义可以表示为:假设有一个排列a_1, a_2, ..., a_n。
如果i < j,并且a_i > a_j,则称(i, j)是排列的一个逆序对。
逆序数count(a)定义为排列中逆序对的个数。
例如,在排列1, 3, 4, 2中,(3, 2)是一个逆序对,(4, 2)是另一个逆序对,因此逆序数为2。
逆序数与排列的关系密切,事实上,逆序数和排列可以相互转化。
对于n个元素的排列,逆序数的范围是从0到(n(n-1))/2。
在排列中,逆序数为0表示排列是有序的,逆序数达到最大值时表示排列是完全逆序的。
逆序数的计算通常可以使用分治法进行高效的求解。
组合数学中的基本原理及其应用卡特兰数Catalan,Eugene,Charles,卡特兰(1814~1894)比利时数学家,生于布鲁日(Brugge),早年在巴黎综合工科学校就读。
1856年任列日(Liege)大学数学教授,并被选为比利时布鲁塞尔科学院院士。
卡特兰一生共发表200多种数学各领域的论著。
在微分几何中,他证明了下述所谓的卡特兰定理:当一个直纹曲线是平面和一般的螺旋面时,他只能是实的极小曲面。
他还和雅可比(Jacobi,C·G·J)同时解决了多重积分的变量替换问题,建立了有关的公式。
1842年,他提出了一种猜想:方程x z-y t=1没有大于1的正整数解,除非平凡情形32-23=1。
这一问题至今尚未解决。
(mathoe注:即除了8、9这两个连续正整数都是正整数的方幂外,没有其他。
1962年我国数学家柯召以极其精湛的方法证明了不存在三个连续正整数,它们都是正整数的方幂,以及方程x2-y n=1,n >1,xy≠0无正整数解。
并且还证明了如果卡特兰猜想不成立,其最小的反例也得大于1016。
)此外,卡特兰还在函数论、伯努利数和其他领域也做出了一定的贡献。
卡特兰通过解决凸n边形的剖分得到了数列C n。
凸n+2边形用其n-1条对角线把此凸n+2边形分割为互不重叠的三角形,这种分法的总数为C n。
为纪念卡特兰,人们使用“卡特兰数”来命名这一数列。
据说有几十种看上去毫不相干的组合计数问题的最终表达式都是卡特兰数的形式。
卡特兰数在数学竞赛、信息学竞赛、组合数学、计算机编程等都会有其不同侧面的介绍。
前几个卡特兰数:规定C0=1,而C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,C7=429,C8=1430,C9=4862,C10=16796,C11=58786,C12=208012,C13=742900,C14=2674440,C15=9694845。
递推公式圆周上有标号为1,2,3,4,……,2n的共计2n个点,这2n个点配对可连成n条弦,且这些弦两两不相交的方式数为卡特兰数C n。
与catalan数相等的统计量Catalan数是一种重要的数列,它在许多学科领域都有着广泛的应用,比如数学、物理和计算机科学等。
它被称为Catalan数,是由著名数学家米歇尔·卡尔托(Miguel de Carentan)于18th世纪初发现的。
Catlan 数可以用数学公式来定义:Cn=∑k=0n(nCk)k,其中n是正整数,nCk 表示从n个不同元素中取出k个元素构成的组合的个数。
一、定义Catalan数可以用递归的方式来定义,即Cn=Cn-1C0+Cn-2C1+Cn-3C2+…+C1Cn-2+C0Cn-1,其中Cn为Catalan数,Cn-1C0表示从n-1个不同元素中取出0个元素构成的组合的个数,Cn-2C1表示从n-2个不同元素中取出1个元素构成的组合的个数以此类推。
二、特点1、Catalan数对应的数列具有无穷多个数分布在一个特定范围之内,其中最常见的是1、2、5、14、42、132等;2、Catalan数可以用一组具有一定性质的数列来表示,其中最常用到的是Stirling数,Eulerian数和华容道数;3、Catalan数可以用来解决一些特定数学问题,比如求解一元多项式的根的自然数个数,求解二叉树的排列组合等。
三、应用1、Catalan数可以用来统计括号对的总数,可以用来解决类似的问题,包括最小括号匹配问题、矩阵链乘法问题、编辑距离问题、最大括号匹配问题等;2、Catalan数也可以用来计算多边形的数量,比如一个有n条边的凸多边形,节点数量有n个,其组成的多边形的数量可以通过Catalan数Cn计算得到;3、Catalan数可以用来求解一元多项式的根的自然数个数,也可以用来求解二叉树的排列组合,甚至可以用来解决数块拼图问题等。
四、总结Catalan数是一种复杂的数列,它在许多学科领域都有着广泛的应用,为各种数学问题提供了简洁的解决方案。
Catalan数可以通过数学公式来定义,同时也可以用递归的方式来求得,其计算具有良好的性能。
在开始撰写文章之前,首先要对主题进行全面的评估。
卡特兰数在数学领域中占据着重要的地位,它涉及到组合数学、计数学、概率等多个领域,因此在探讨codeforces关于卡特兰数的题目时,需要深入理解和解释这一概念。
卡特兰数是一种常见的数学概念,用来表示在不同排列、组合情况下的计数问题。
在codeforces的算法题目中,经常会涉及到卡特兰数的应用,例如在树的计数、括号序列的生成、合法的括号匹配等方面。
了解卡特兰数的性质和应用是解决这些问题的关键。
卡特兰数的定义和性质是必须要深入了解的。
卡特兰数通常用Catalan(n)表示,表示在n个节点的合法二叉树的数量。
它还有许多其他等价的定义,比如卡特兰数是括号序列的计数、Dyck路径的计数等等。
了解这些定义可以帮助我们更好地理解卡特兰数的意义和应用。
在解题过程中,掌握计算卡特兰数的方法也是非常重要的。
常见的方法包括动态规划、递推关系、树的计数等。
在codeforces的题目中,经常会利用这些方法来求解卡特兰数相关的问题,因此熟练掌握这些方法可以帮助我们更快地解决问题。
在文章中要重点介绍codeforces中与卡特兰数相关的经典题目,例如“A Simple Task”、“Tree Dynamic”、“Bracket Sequence”等,这些题目既能够帮助我们更好地理解卡特兰数的应用,也能够提高我们在解决类似问题时的能力和技巧。
在撰写文章的过程中,应该对本文提供的内容进行总结和回顾,以便读者能够全面、深刻地理解卡特兰数在codeforces中的应用和意义。
共享个人对于卡特兰数的理解和观点也是不可或缺的,这可以帮助读者更好地理解和接受文章的内容。
总体而言,撰写一篇探讨codeforces关于卡特兰数的题目的文章是需要深度和广度兼具的,需要对卡特兰数的定义、性质、计算方法等进行全面的评估并进行深入的探讨,同时结合具体的题目进行分析和解释,这样才能写出一篇高质量、有价值的文章。
卡特兰数
百科名片
卡特兰数又称卡塔兰数,是组合数学中一个常出现在各种计数问题中出现的数列。
由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。
目录
卡特兰数
英文
原理
卡特兰数的应用
卡特兰数
英文
原理
卡特兰数的应用
展开
编辑本段卡特兰数
前几项为(OEIS中的数列A000108): 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
编辑本段英文
Catalan数
编辑本段原理
令h(1)=1,h(0)=1,catalan数满足递归式:
h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2)
另类递归式:
h(n)=((4*n-2)/(n+1))*h(n-1);
该递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=1,2,3,...)
编辑本段卡特兰数的应用
实质上都是递归等式的应用
括号化问题
矩阵链乘:P=a1×a2×a3×……×an,依据乘法结合律,不改变其顺序,只用括号表示成对的乘积,试问有几种括号化的方案?(h(n)种)
出栈次序问题
一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列?
分析
对于每一个数来说,必须进栈一次、出栈一次。
我们把进栈设为状态‘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位数必对应一个不符合要求的数。
因而不合要求的2n位数与n+1个0,n-1个1组成的排列一一对应。
显然,不符合要求的方案数为c(2n,n+1)。
由此得出输出序列的总数目=c(2n,n)-c(2n,n+1)=1/(n+1)*c(2n,n)。
(这个公式的下标是从h(0)=1开始的)
类似问题
有2n个人排成一行进入剧场。
入场费5元。
其中只有n个人有一张5元钞票,另外n 人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
凸多边形的三角剖分问题
求将一个凸多边形区域分成三角形区域的方法数。
类似:一位大城市的律师在她住所以北n个街区和以东n个街区处工作。
每天她走2n 个街区去上班。
如果她从不穿越(但可以碰到)从家到办公室的对角线,那么有多少条可能
的道路?
类似:在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数?
用给定节点组成二叉树的问题
给定N个节点,能构成多少种不同的二叉树?
(能构成h(N)个)
最近,翻回了一下数据结构的书,大三上的课,现在有些内容忘了。
书的最后一章“数据结构的综合应用”里面有一道N列火车进出站的问题,把问题简化了,就是N个数进出栈的问题:即N个数有多少种不同的进出栈顺序(只考虑进栈和出栈的次序,不考虑数的大小,即N个“相同”的数)。
那时候,我是用穷举法来做的,即求出N个数的进出栈的全排列,删除存在某个位置之前进栈次数小于出栈次数的排列。
现在重新想了一下,想到了自己分析过的一道身高排队的题目:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
其实,这两个问题之前存在着一种巧妙的同构关系:在身高排队问题中,我们可以先把12个高矮不同的人按身高从低到高排成一列,每次把队头的人选择放入第一排或是第二排的队尾,此时只要保证每次把人放入队尾的时候,第一排的人数不少于第二排即可,因为这样就保证了任何时候第二排的人一定第一排的高;而在N个数的进出栈问题中,假设N=12,则可以把进栈在整个操作中的次序(整个操作由进栈和出栈组成)放到身高排队问题中的第一排,相应地把出栈的次序放到第二排,保证任何时候第一排中的进栈次数不少第二排的出栈次数即可。
我修改了一下解决身高排队问题的代码,同样用非穷举的方法来解决这个问题:Java代码
1.import java.util.Stack;
2.
3.public class PushPopStack {
4.
5.private int count = 0;
6.private int total = 0;
7.private Stack<Integer>pushOrders = new Stack<Integer>(); //存放
进栈的次序
8.
9.public PushPopStack(int total) {
10.this.total = total;
11.}
12.
13.private void printOrders() {
14.for (int operOrder = 1, i = 0; operOrder<= total; operOrder++) {
15.if (i <pushOrders.size() &&pushOrders.get(i) == operOrder) {
16.System.out.print("进 ");
17.i++;
18.} else {
19.System.out.print("出 ");
20.}
21.}
22.System.out.println();
23.}
24.
25.private void pushOrder(int order, int level) {
26.pushOrders.push(order);
27.if (level >= total / 2) {
28.count++;
29.printOrders(); // 打印一种进出栈顺序
30.pushOrders.pop();
31.return;
32.}
33.
34.for (int i = order + 1; i < 2 * (level + 1); i++)
35.pushOrder(i, level + 1);
36.pushOrders.pop();
37.}
38.
39.public void pushPopOrder() {
40.pushOrder(1, 1);
41.System.out.println(total + " 个元素一共有 " + count + " 种不同的
进出栈顺序。
");
42.}
43.
44.public static void main(String[] args) {
45.PushPopStack stack = new PushPopStack(12);
46.stack.pushPopOrder();
47.}
48.}。