卡特兰数及括号正确匹配个数问题解释

数据结构 | 算法中的卡特兰数的应用 输入一个整数n,计算h(n)。令h(0)=1,h(1)=1,Catalan数满足递推式例如另类递推式递推关系的解为递推关系的另类解为//函数功能计算Catalan的第n项//函数参数n为项数//返回值第n个Catalan数{return1;//保存临时结果//h(0)和h(1)i... 阅读详情

今天碰到这样一个问题:

 n对括号正确匹配组成的字符串数,例如

1对括号:()                                              1种可能

2对括号:()()                                            1种可能

 3对括号:((())) ()(()) ()()() (())() (()())       5种可能

那么问题:n对括号有多少种正确配对的可能?


网上搜索了下,原来是卡特兰数问题。

百度百科解释:卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 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, ...

公式:卡特兰数有固定的解法公式,以后碰到可以直接用公式来求解。(以下这4种计算等价)

令h(0)=1,h(1)=1,catalan数满足递推式  :
公式1:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
另类递推式:
公式2:h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的解为:
公式3:h(n)=C(2n,n)/(n+1) (n=0,1,2,...)
递推关系的另类解为:
公式4:h(n)=c(2n,n)-c(2n,n+1)(n=0,1,2,...)
常见卡特兰数应用:
(1)一个 栈 (无穷大)的 进栈 序列为1,2,3,…,n,有多少个不同的 出栈 序列
(2)买票找零:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?
(3)

凸多边形三角划分:在一个凸多边形中,通过若干条互不相交的对角线,把这个多边形划分成了若干个三角形。任务是键盘上输入凸多边形的边数n,求不同划分的方案数f(n)。比如当n=6时,f(6)=14。


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

卡特兰数 - lz_666888 - lz_666888的博客


(5)长度为 2n的 Dyck words的数量。 Dyck words是由 n个 X和 n个 Y组成的字符串,并且从左往右数, Y的数量不超过 X。

(6) 拥有 n+1 个叶子节点的二叉树的数量。例如 4个叶子节点的所有二叉树形态:

卡特兰数 - lz_666888 - lz_666888的博客

(7)圆桌握手问题: 圆桌周围有 2n个人,他们两两握手,但没有交叉的方案数。

(8)本文的“n对括号正确匹配组成的字符串数”问题。

虽然同属于卡特兰数问题,但是用同样的方法解释似乎行不通(看百度百科上的解释:关于出栈的问题。还是比较容易理解的,但是我却不能通过它理解本题)

最后发现是《编程之美2》这本书上的原题。其解释如下:

分析

    “卡特兰数”除了可以使用公式计算,也可以采用“分级排列法”来求解。以 n对括弧的合法匹配为例,对于一个序列 (()而言,有两个左括弧,和一个右括弧,可以看成“抵消了一对括弧,还剩下一个左括弧等待抵消”,那么说明还可以在末尾增加一个右括弧,或者一个左括弧,没有左括弧剩余的时候,不能添加右括弧。

    由此,问题可以理解为,总共 2n个括弧,求 1~2n级的情况,第 i 级保存所有剩余 i 个左括号的排列方案数。 1~8级的计算过程如下表:

(这里,我搞了很久才折腾明白,行1-8表示级数--括弧个数,列0-8表示不完整匹配左括号个数。红色为博主解释,其他为原文)

卡特兰数 - lz_666888 - lz_666888的博客

比如:1级: 只有一个,只能是左括号(。右括号不能先出现啊。

                      不完整左括号个数为  1个。                      (

             2级:由1级的左括号(,如果给它右括号,则完整匹配;此时不完整匹配左括号个数为0,因此在0这一列下为1;

                                                      如果给再给它左括号,则不完整匹配左括号个数为2,只有一种情况: ((         个数为1

                                                      不完整匹配左括号个数为1这种情况不存在!!!因此不填。

             3级:一定是不完整的,所以不完整匹配左括号个数为0 的下方  空缺;

                       由2级可知,原来有完整匹配 1个”()",   现在又增加了1个括弧,那么只能又出现了一个不完整匹配左括号

                                            原来有不完整匹配左括号2个“((",现在如果增加一个右括号,则不完整匹配左括号个数为1的情况+1

                                                                                                              如果增加一个左括号,则不完整匹配左括号个数为3的情况+1

       现在明白为什么下一级的个数为上一级相邻两边相加。比如3级 1列(0列起始)下=2级0列+2级2列。

依次类推:

        4级:原来3级中有2个不完整1次括弧,那么4级中就有   完整匹配    2次。

                 4级中不完整2次括弧=3级的不完整1次+3级的不完整3次。

                4级的不完整4次括弧 只能是"(((("全左括号,所以每行最后一个数字为1,表示全左括号。

over


    计算过程解释如下: 1级:只能放 1个“(”; 2级:可以在一级末尾增加一个“)”或者一个“ (”

以后每级计算时,如果遇到剩余 n>0个“(”的方案,可以在末尾增加一个“ (”或者“ )”进入下一级;遇到剩余 n=0个“(”的方案,可以在末尾增加一个“ (”进入下一级。

奇数级只能包含剩余奇数个“(”的排列方案

偶数级只能包含剩余偶数个“(”的排列方案

从表中可以看出,灰色部分可以不用计算。

解法

关键代码为:

double Catalan(int n) { if (n == 0) return 1; for (int i = 2; i <= 2 * n; i++) { var m = i <= n ? i : 2 * n + 1 - i; for (int j = (i - 1) & 1; j <= m; j += 2) { if (j > 0) arr[j - 1] += arr[j]; if (j < n) arr[j + 1] += arr[j]; arr[j] = 0; } } return arr[0]; }

 

其中:

n为 Cn中的 n;

arr = new double[n + 1];//arr[i]代表有 k个括弧的时候,剩余 "("个数为 i的排列方案个数 arr[1] = 1;

 

讨论

算法复杂度为 卡特兰数 - lz_666888 - lz_666888的博客 = O(n^2),空间复杂度为 O(n+1)。相对于利用公式计算而言,此方法的优势在于——没有乘除法,只有加法。






卡特兰数递推公式证明及应用 目录卡特兰数定义递推公式公式1:公式2:公式3:公式4:应用场景公式1证明公式2证明公式3证明公式4证明例题 卡特兰数 定义 在oeis上可以看到卡特兰数的定义如下。 递推公式 f[0] = f[1] = 1 公式1: f[n]=f[0]f[n-1]+f[1]f[n-2]+...+f[n-1]f[0]' 公式2: h[n]=h[n−1]∗(4∗n−2)/(n+1) 公式3: h[n]=C[2n,... 阅读详情

相关推荐

手把手教你用单结晶体管搭建简易振荡电路(含电路图和波形分析)

本文详细介绍了如何使用单结晶体管(UJT)搭建简易振荡电路,包括电路设计、波形分析和实战技巧。通过具体的电路图和参数计算,帮助电子爱好者和工程师快速掌握UJT振荡器的设计与调试方法,适用于脉冲信号生成和时钟源制作等应用场景。

weixin_29207533的博客 516

【算法笔记】卡特兰数(一招解决括号匹配和二叉搜索树个数等问题)

卡特兰数是一个出现在各种组合问题中的数列,比如“括号排列”“二叉树结构”“路径不走对角线”等。它像魔法一样,帮你快速算出这些问题的答案。 数列前几项: 当 n=0n=0 时,C0=1C0=1 当 n=1n=1 时,C1=1C1=1 当 n=2n=2 时,C2=2C2=2 当 n=3n=3 时,C3=5C3=5 当 n=4n=4 时,C4=14C4=14 ...(依次类推)

weixin_74297512的博客 4067

Android Settings 设置Preference置灰显示

使Preference置灰显示,不能点击。先调用Preference的setEnabled(false),再调用setShouldDisableView(true); 如果使置灰项恢复正常可点击,可调用setEnabled(true)。

随风而动 1048

卡特兰数——括号匹配问题

卡特兰数的递推公式是F(n)=∑(k=1…n){F(k-1)*F(n-k)}=∑(k=0…n-1){F(k)*F(n-k-1)} 一般性公式为F(n)=C(2n,n)/(n+1) 可以描述的问题有 1、n个元素的二叉查找树有多少种。 2、n*n棋盘从左下角走到右上角而不穿过主对角线的走法。 3、2n个人排队买票问题,票价50,n个人拿50元,n个人拿100元,售票处无零钱,能顺利卖票

zz_ylolita 2988

AWR1642+DCA1000EVM 不使用mmWave Studio软件采集原始ADC数据 Timeout问题汇总

DCA1000 EVM Timeout问题汇总

Jesy_Hsu的博客 1476

向量数据库安全实战:从Embedding反推到检索越权的全链路防护

随着RAG应用在企业中的普及,向量数据库已成为知识库系统的核心组件。但许多团队对向量数据的安全认知仍停留在传统数据库的账号密码、网络隔离和磁盘加密上。事实上,向量化并非加密,而是一种有损压缩的语义映射,向量本身可以被反推模型还原出原文关键信息,形成高保真的语义泄露通道。同时,相似度检索的模糊匹配特性打破了传统行列权限模型,使得越权检索和成员推断攻击成为新的安全威胁。理解这些原理,有助于企业在数据采集、向量化、索引构建、检索查询等环节构建分层防护体系,包括脱敏、扰动、过滤下推、网关控制等手段。本文从基础概念出

weixin_29323551的博客 259

卡塔兰数

https://blog.youkuaiyun.com/hangelsing/article/details/47807663 https://huangqinjian.blog.youkuaiyun.com/article/details/53924772 其前几项为(从第零项开始) : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 0 1 2 3 4 5 6 ...

让, 273

【chatgpt代码系列】磁导航纠偏算法推导

例如,可以根据AGV偏离路径的方向和距离,计算出需要进行的修正角度和移动距离,然后通过控制算法实现对AGV的纠偏。具体来说,磁导航AGV的行驶是通过磁场传感器感知地面磁场信号,然后根据信号的强度和方向来确定AGV的位置和方向,进而控制AGV的行驶。但是,在实际应用中,由于地面磁场信号的变化和干扰等因素,磁导航AGV可能会出现偏离路径的情况,导致行驶不稳定甚至出现误差。磁导航AGV纠偏公式是通过对AGV行驶中偏离路径的原因进行分析,结合磁导航AGV的工作原理和控制算法,推导出来的。假设AGV的目标方向为。

少磊的博客 2807

Catalan number(卡特兰数)详解,超详细!!!

卡特兰数为(从零项开始):1,1,2,5,14,42,132,429,1430,4862,⋯1,1,2,5,14,42,132,429,1430,4862,\cdots1,1,2,5,14,42,132,429,1430,4862,⋯我们从 入手就拿 555 对括号来说,可以分为 555 个类型:既然这 555 对括号是合法的,就说明最左边的左括号就是第一位也就是说,这对括号是最外层的那么整个括号序列就被它分成了两部分就拿 来说,这对括号里边有 000 对括号,外边有 444 对括号000 对括号的合法

小 P 的博客 4972

保姆级教程:在MMSegmentation框架下复现HRNetV2+OCR语义分割(附完整代码与调试技巧)

本文提供了一份详细的MMSegmentation框架下HRNetV2+OCR语义分割的复现教程,包含完整代码与调试技巧。通过解析HRNetV2的多尺度特征融合和OCR模块的注意力计算,帮助开发者快速实现这一经典语义分割方案,并解决实际工程中的常见问题。

weixin_42527464的博客 359

CloudCompare 二次开发(35)——提取多条直线

使用CloudCompare与PCL编程实现的多条空间直线的提取。

点云侠的博客 438

n对括号的匹配方式(卡特兰数)

4对括号有多少种可能的合法匹配方式?n对括号呢? 此题是卡特兰数的一个通常应用,相似的还有出栈顺序等。关于卡特兰数的具体内容,请参阅百度百科或Wiki. http://baike.baidu.com/view/2499752.htm   网络上可以搜到很多相关的题目和解答,但是鲜有易懂的推导过程。这里记录一种推导过程如下:   结论:对于n对括号,合法的排列共有C(n,2n) -

immiao的专栏 5608

【AirPlay】苹果认证MFI学习

配件认证是一个过程,通过这个过程,可验证其配件符合MFi技术规范,并通过苹果指定的任何认证测试。MFi门户中的产品计划 "认证 "页面将指导你完成特定配件所需的认证步骤,并指出何时完成所有要求。在完成所有MFi认证要求之前,你不得制造、分发或销售任何配件。在开始MFi认证过程之前,你必须测试你的配件,以确保它符合最新的MFi技术规范,通过产品计划 "测试计划 "上的所有适用测试,并与它将声称具有兼容性的每个苹果设备兼容。

天天的博客 2275

通俗易懂 || n 对括号可以有多少种匹配排列方式

文章目录题目解题思路解法一解法二 题目 【(本科组)第十一届蓝桥杯省模拟赛】 由1对括号,可以组成一种合法括号序列:()。 由2对括号,可以组成两种合法括号序列:()()、(())。 由4对括号组成的合法括号序列一共有多少种? 解题思路 首先这是一道典型的括号匹配问题 解法一 关于括号匹配问题 —> 可以运用 卡特兰数(入栈顺序解法之一) 递推公式 h(n)=C(2n,n)/(n+1) (n=0,1,2,...) 解法二 运用 递归 右括号的数量不能超过左括号 函数的两个参数分别为

QuantumYou的博客 2660

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

卡特兰(Catalan)数入门详解

基本概念 介绍 学卡特兰数我觉得可能比组合数要难一点,因为组合数可以很明确的告诉你那个公式是在干什么,而卡特兰数却像是在用大量例子来解释什么时卡特兰数 这里,我对卡特兰数做一点自己的理解 卡特兰数是一个在组合数学里经常出现的一个数列,它并没有一个具体的意义,却是一个十分常见的数学规律 对卡特兰数的初步理解:有一些操作,这些操作有着一定的限制,如一种操作数不能超过另外一种操作数,或者两种操作不能有交...

Morning_Glory_JR的博客 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

卡特兰数(Catalan)及其应用

卡特兰数 卡特兰数是组合数学中一个常出现在各种计数问题中出现的数列。 卡特兰数前几项为 : C0=1,C1=1,C2=2,C3=5,C4=14,C5=42,C6=132,C7=429,C8=1430,C9=4862,C10=16796 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440

ZkvIA的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

浅析卡特兰数

主要讲了卡特兰数

gxzssyh的博客 3056

出栈序列问题——卡特兰数

卡特兰数(Catalan Number)是一系列在组合数学中经常出现的自然数。卡特兰数的第 n 项(记作c n表示许多组合问题的解的数量。C01C11C22C35C414C542C0​1C1​1C2​2C3​5C4​14C5​42Cn1n12nnCn​n11​n2n​其中,2nnn2n​是组合数,表示从 (2n) 个元素中选取 (n) 个元素的组合数。栈的性质。

tanactor的博客 1376

卡特兰数之括号匹配数问题(HDU5673)

摘抄百度百科: 卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名,其前几项为 : 1,1,2,5,14,42,132,429,1430,4862,16796,58786,208012,742900,2674440,9694845,35357670,129644790,4776...

weixin_43965698的博客 1586

卡特兰数学习

卡特兰数(英语:Catalan number),又称卡塔兰数,明安图数。是。它在不同的计数问题中频繁出现。

2401_82677021的博客 3120

卡特兰数(Catalan)

太神奇辣,卡特兰数

2301_79199219的博客 2302

出栈序列数与括号匹配(卡特兰数的应用)

摘要:n个元素顺序入栈的出栈序列总数为第n个卡特兰数,可通过括号匹配问题建模。合法序列需满足任何前缀中入栈数≥出栈数。利用反射原理计算:从(0,0)到(n,n)的路径中,合法路径数=总路径数减去非法路径数(首次穿过y=x后作镜像对称)。最终卡特兰数公式为Cₙ=[1/(n+1)]C(2n,n),该数同时表示合法括号匹配数、栈序列数等多种组合问题。

Sintream_ouse的博客 994

卡特兰数

卡特兰数的讲解及其背后的数学思想,“括号合法”模型

明朗晨光的专栏 4145

C++卡特兰数讲解

C++卡特兰数的定义、公式、推导及应用典例。

2401_90042730的博客 2051

什么是卡特兰数

#简介 卡特兰数是组合数学中一个常出现在各种计数问题中的数列。以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名。 数列的前几项为:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862,… 卡特兰数Cn满足以下递推关系: Cn+1 = C0Cn + C1Cn-1 + ··· + CnC0 ##原理 设h(n)为catalan数的第n+1项,令h(0)=1,h(1)=1,catalan数满足递推式: h(n)= h(0) * h(n-1) + h

weixin_44471490的博客 3584
上一篇: CV&DL&ML等资源整理
下一篇: 摄像机几何概念
magic_andy
博客等级 码龄19年 8粉丝 34原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值