当前位置: 首页 > news >正文

卡特兰数、斯特林数基础

卡特兰数

从格点(0,0)(0,0)(0,0)走到格点(n,n)(n,n)(n,n),只能向右或向上走,不能穿过对角线,的路径的条数,称为卡特兰数HnH_nHn
在这里插入图片描述
则有H0=1H_0=1H0=1

通项公式:

  1. Hn=(2nn)−(2nn−1)H_n=\begin{pmatrix} 2n\\ n \end{pmatrix}-\begin{pmatrix} 2n\\ n-1 \end{pmatrix}Hn=(2nn)(2nn1)
  2. Hn=(2nn)n+1H_n=\frac {\begin{pmatrix} 2n\\ n \end{pmatrix}}{n+1}Hn=n+1(2nn)
  3. Hn=4n−2n+1Hn−1H_n=\frac{4n-2}{n+1}H_{n-1}Hn=n+14n2Hn1

折线法

证明一下卡特兰数的公式。

先证明公式1:
如果没有限制,那么路径总数是,从2n2n2n步移动之中,选出nnn步向上走,另外nnn步向右走的方案数(2nn)\begin{pmatrix} 2n\\ n \end{pmatrix}(2nn)

如果有限制,我们画出y=x+1y=x+1y=x+1的函数图像,碰到这条线,意味着不合法。
把所有不合法的路径沿着这条图像对折过来,其终点必然是(n−1,n+1)(n-1,n+1)(n1,n+1)
换句话说,所有到达(n−1,n+1)(n-1,n+1)(n1,n+1)的路径,都对应着到达(n,n)(n,n)(n,n)的一条不合法路径。因此答案就是(2nn)−(n+1+n−1n−1)\begin{pmatrix} 2n\\ n \end{pmatrix}-\begin{pmatrix} n+1+n-1\\ n-1 \end{pmatrix}(2nn)(n+1+n1n1)
在这里插入图片描述

QED.

证明一下公式2:
(2nn)−(2nn−1)\begin{pmatrix} 2n\\ n \end{pmatrix}-\begin{pmatrix} 2n\\ n-1 \end{pmatrix}(2nn)(2nn1)
=(2n)!n!n!−(2n)!(n+1)!(n−1)!=\frac{(2n)!}{n!n!}-\frac {(2n)!}{(n+1)!(n-1)!}=n!n!(2n)!(n+1)!(n1)!(2n)!
=(2n)!n!(n−1)!n−(2n)!n!(n−1)!(n+1)=\frac{(2n)!}{n!(n-1)!n}-\frac {(2n)!}{n!(n-1)!(n+1)}=n!(n1)!n(2n)!n!(n1)!(n+1)(2n)!
=(2n)!n!(n−1)!⋅(1n−1n+1)=\frac{(2n)!}{n!(n-1)!}\cdot\left(\frac{1}{n}-\frac 1{n+1}\right)=n!(n1)!(2n)!(n1n+11)
=(2n)!n!(n−1)!n−(2n)!n!(n−1)!(n+1)=\frac{(2n)!}{n!(n-1)!n}-\frac {(2n)!}{n!(n-1)!(n+1)}=n!(n1)!n(2n)!n!(n1)!(n+1)(2n)!
=(2n)!n!(n−1)!⋅(1n−1n+1)=\frac{(2n)!}{n!(n-1)!}\cdot\left(\frac{1}{n}-\frac 1{n+1}\right)=n!(n1)!(2n)!(n1n+11)
=(2n)!n!(n−1)!⋅1n(n+1)=\frac{(2n)!}{n!(n-1)!}\cdot\frac {1}{n(n+1)}=n!(n1)!(2n)!n(n+1)1
=(2n)!n!n!⋅1n+1=\frac{(2n)!}{n!n!}\cdot\frac {1}{n+1}=n!n!(2n)!n+11
=(2nn)⋅1n+1=\begin{pmatrix} 2n\\ n \end{pmatrix}\cdot\frac {1}{n+1}=(2nn)n+11

QED.

证明一下公式3:
留作习题,读者自证不难。

常见情况

特点:一种操作不能超过另一种操作,或操作之间不能有交集。

例如:

  1. 一个由nnn000nnn111组成的长度为2n2n2n的字符串,满足所有前缀中,111的个数不能超过000的个数,这样的子串数量。
  2. 包含nnn组括号的合法表达式的数量。
    (想要括号序列合法,必须保证所有前缀中,左括号的数量大于等于右括号的数量)
  3. 一个栈的进栈序列为1,2,...,n1,2,...,n1,2,...,n,则出栈序列的可能数量。
    (必须保证出栈数量小于等于进栈数量)
  4. 在圆上选择2n2n2n个点,连接起来形成nnn条不相交的弦的方案数。
    (把nnn条不相交的弦映射为括号序列,把弦的左端映射为左括号,右端映射为右括号)
  5. 通过连接顶点将n+2n+2n+2条边的正多边形分为nnn个三角形的方案数(三角剖分)。
    (想要保证分为nnn个三角形,必须保证连接的线不相交)
  6. nnn个节点可以构造多少颗不同的二叉树?
    考虑对n+2n+2n+2条边的多边形三角剖分,把剖分得出的三角形抽象为一个节点,对它相邻的三角形连边,最后得出必定是一颗二叉树。
  7. 一段连乘积有多少种运算次序?
    (相当于给连乘积加括号)

公式法

事实上有:
Hn=∑i=0n−1HiHn−i−1H_n=\overset{n-1}{\underset{i=0}\sum}H_iH_{n-i-1}Hn=i=0n1HiHni1

可以从两个方面来证明一下:

  • 出栈序列
    考虑iii是最后一个出栈的数,则[1,i−1][1,i-1][1,i1]iii进栈之前就出栈了,情况数有Hi−1H_{i-1}Hi1种,而iii后面的n−in-ini个数,则必然在iii出栈前就出栈了,情况数有Hn−iH_{n-i}Hni种,枚举这个iii,得到
    Hn=∑i=1nHi−1Hn−i=∑i=0n−1HiHn−i−1H_n=\overset{n}{\underset{i=1}\sum}H_{i-1}H_{n-i}=\overset{n-1}{\underset{i=0}\sum}H_iH_{n-i-1}Hn=i=1nHi1Hni=i=0n1HiHni1
  • 格点计数
    我们知道,在格点卡特兰数的要求中,路径不能越过对角线。我们可知,在走到终点之前的一步,一定是向上走的:

    红色表示最后一步。

显然,碰到对角线之后,一定是向右走的,我们枚举对角线上的一个点,使得走完向右走的那一步之后,不能越过新的对角线,统计的路径条数:
在这里插入图片描述
绿色,枚举的位置。
红色,最后一步。
蓝色,新的对角线。

此时我们发现,从底下走到绿色圆圈,不能越过对角线。与从绿色箭头走到红色圆圈,不能越过蓝线,是两个更小的卡特兰数问题,因此可以用乘法原理计数。

我们注意到,我们枚举的一种新的情况,在我们枚举的更旧的情况中都属于不合法情况,不会被重复统计。

QED.

用公式同样可以解释各种卡特兰数的情况。

  1. 一个由nnn000nnn111组成的长度为2n2n2n的字符串,满足所有前缀中,111的个数不能超过000的个数,这样的子串数量。
    注意到最后一个字符一定是111,枚举一个位置的000,使得这个000与末尾的那个111匹配,转化为格点计数的情况。
  2. 包含nnn组括号的合法表达式的数量。
    同理。
  3. 一个栈的进栈序列为1,2,...,n1,2,...,n1,2,...,n,则出栈序列的可能数量。
    同理。
  4. 在圆上选择2n2n2n个点,连接起来形成nnn条不相交的弦的方案数。
    同理,枚举一个点与最后那个点(任意指定一个固定的点为最后的点)连接成弦。
  5. 通过连接顶点将n+2n+2n+2条边的正多边形分为nnn个三角形的方案数(三角剖分)。
    同理4。
  6. nnn个节点可以构造多少颗不同的二叉树?
    枚举根节点有iii个左子树,则就会有n−i−1n-i-1ni1个右子树,显然。

斯特林数

第一类斯特林数

定义[nm]\begin{bmatrix}n\\ m\end{bmatrix}[nm]表示nnn元集合划分为mmm个非空环排列的方案数,即无符号第一类斯特林数,或简称为第一类斯特林数,斯特林轮换数。

第一类斯特林数有递推式:
[nm]=[n−1m−1]+(n−1)[n−1m]\begin{bmatrix} n\\ m \end{bmatrix}=\begin{bmatrix} n-1\\ m-1 \end{bmatrix}+(n-1)\begin{bmatrix} n-1\\ m \end{bmatrix}[nm]=[n1m1]+(n1)[n1m]

递推式容易证明,留作习题。

第二类斯特林数

定义{nm}\begin{Bmatrix} n\\ m \end{Bmatrix}{nm}表示将nnn元集合划分为mmm个非空子集的方案数,即第二类斯特林数,或斯特林子集数。

第二类斯特林数有递推式:
{nm}={n−1m−1}+m{n−1m}\begin{Bmatrix} n\\ m \end{Bmatrix}=\begin{Bmatrix} n-1\\ m-1 \end{Bmatrix}+m\begin{Bmatrix} n-1\\ m \end{Bmatrix}{nm}={n1m1}+m{n1m}

递推式容易证明,留作习题。

其他

  • 两类斯特林数的边界条件都是s[0][0]=1s[0][0]=1s[0][0]=1
  • 从递推式可以看出,斯特林数增长比组合数还要快。
  • 斯特林数用于解决组合计数问题,以及用于斯特林反演。这些问题较复杂,单独讨论。

后记

于是皆大欢喜。

相关文章:

卡特兰数、斯特林数基础

卡特兰数 从格点(0,0)(0,0)(0,0)走到格点(n,n)(n,n)(n,n),只能向右或向上走,不能穿过对角线,的路径的条数,称为卡特兰数HnH_nHn​。 则有H01H_01H0​1。 通项公式: Hn(2nn)−(2nn−1)H_n\begin{pmatrix} 2n\\ n \en…...

STL——mapmultimap和setmultiset

一、关联式容器 与序列式容器相同&#xff0c;关联式容器也是用于存储数据的&#xff0c;不同的是&#xff0c;关联式容器里存储的是<key, value>结构的键值对&#xff0c;在数据检索时比序列式容器效率更高。 二、键值对 用来表示具有一一对应的一种结构&#xff0c;该…...

2023热门抖音权重查询小程序源码

2023热门抖音权重查询小程序源码 跟抖音上很火的一模一样&#xff0c;小程序适配优化。接口免费。小程序不是网页 修改教程: 1&#xff0c;如果想修改或者去除水印&#xff0c;直接删除或修改“index.html”12&#xff5e;22行 2&#xff0c;如果想修改logo&#xff0c;直接…...

153.网络安全渗透测试—[Cobalt Strike系列]—[生成hta/exe/宏后门]

我认为&#xff0c;无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感&#xff01;&#xff01;&#xff01; 文章目录一、后门简介1、hta后门2、exe后门3、宏病毒后门二、生成后门并测试0、测试环境1、生成hta后门并测试2、生成exe后门并测试3、生成宏病毒后门…...

如何成为优秀的程序员

崔宝秋&#xff0c;现任小米首席架构师、小米云平台负责人。1995年赴美留学&#xff0c;纽约州立大学石溪分校计算机科学系博士毕业&#xff0c;曾任IBM高级工程师和高级研发经理、雅虎搜索技术核心团队主任工程师、LinkedIn主任工程师&#xff0c;2012年回国加入小米科技。 20…...

多线程(四):线程安全

在开始讲解线程安全之前我们先来回顾一下我们学了那些东西了&#xff1a; 1. 线程和进程的认识 2. Thread 类的基本用法 3. 简单认识线程状态 4. 初见线程安全 上一章结束时看了一眼线程安全问题&#xff0c;本章将针对这个重点讲解。 一个代码在单线程中能够安全执行&am…...

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解Camera的使用

&#x1f347; 博主主页&#xff1a; 【Systemcall小酒屋】&#x1f347; 博主追寻&#xff1a;热衷于用简单的案例讲述复杂的技术&#xff0c;“假传万卷书&#xff0c;真传一案例”&#xff0c;这是林群院士说过的一句话&#xff0c;另外“成就是最好的老师”&#xff0c;技术…...

C++之模拟实现string

文章目录前言一、包含的相关头文件二、构造和析构1.构造函数2.拷贝构造1.传统写法2.现代写法3.赋值运算符重载1.传统写法2.现代写法4.析构函数三、iterator四、modify1.push_back(尾插一个字符&#xff09;2.append&#xff08;尾插一个字符串&#xff09;3.运算符重载1.尾插字…...

SpringBoot实战(十三)集成 Admin

目录一、简介二、搭建 springboot-admin 管理服务1.Maven 依赖2.application.yml3.添加 EnableAdminServer4.启动服务&#xff0c;查看页面三、搭建 springboot-admin-client 客户端服务1.Maven 依赖2.application.yml3.启动服务&#xff0c;查看页面四、搭配 Eureka 使用1.搭建…...

mke2fs命令:建立ext2文件系统

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 使用格式 mke2fs [options] [设备名称] [区块数] options与含义 -c&#xff1a;检查是否有损坏的区块。-F&#xff1a;不管指定的设备为何&#xff0c;强制执行mke2fs。-M&#xff1a;记录最后一次挂入的…...

免费分享一个springboot+vue的办公系统

springbootvue的OA系统项目介绍项目部署项目特点项目展示项目介绍 这是一个采用前后端分离开发的项目&#xff0c;前端采用 Vue 开发、后端采用 SpringBoot Mybatis 开发。 很适合java初学者练手和学习。 前端技术&#xff1a;Vue3.2 Vue-Router Pinia Ant Design Vue 3.X…...

STM32数据搬运工DMA

DMA的概念DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路&#xff…...

4、操作系统——进程间通信(2)(system V-IPC介绍)

目录 一、system V-IPC常识 1、key和ID 2、文件描述符 3、函数&#xff08;ftok&#xff09; ftok产生IPC对象的健值key&#xff08;类似文件路径&#xff09; 4、例子 5、使用命令查看或删除当前系统中的IPC对象 一、system V-IPC常识 1、key和ID &#xff08;1&#x…...

基于CentOS Stream 9平台搭建Nacos2.0.4集群以及OpenResty反向代理

目录展示Nacos2.0.4集群搭建1. 下载2. 解压3.修改配置3.1分别修改下启动类中JDK路径以及启动大小3.2 分别配置数据源3.3 创建nacos数据库3.4 修改cluster.conf配置3.4.1 复制并修改3.4.2 编辑文件&#xff0c;修改三台主机地址3.4.3 分别放入另外两个nacos的conf目录下:4. 启动…...

老杜MySQL入门基础 第二天

导入演示数据 1、连接MySQL 2、创建"bjpowernode"数据库 create database bjpowernode;3、选择数据库 use bjpowernode4、导入数据 source D&#xff1a;\bjpowernode.sql(文件的路径)1 去除重复记录(把查询结果去除重复记录)(原表数据不会改变) 使用关键字dist…...

Python深度学习实战:人脸关键点(15点)检测pytorch实现

引言 人脸关键点检测即对人类面部若干个点位置进行检测&#xff0c;可以通过这些点的变化来实现许多功能&#xff0c;该技术可以应用到很多领域&#xff0c;例如捕捉人脸的关键点&#xff0c;然后驱动动画人物做相同的面部表情&#xff1b;识别人脸的面部表情&#xff0c;让机…...

linux简单入门

目录Linux简介Linux目录结构Linux文件命令文件处理命令文件查看命令常用文件查看命令Linux的用户和组介绍Linux权限管理Linux简介 Linux&#xff0c;全称GNU/Linux&#xff0c;是一种免费使用和自由传播的类UNIX操作系统&#xff0c;其内核由林纳斯本纳第克特托瓦兹&#xff0…...

给准备面试网络工程师岗位的应届生一些建议

你听完这个故事&#xff0c;应该会有所收获。最近有一个23届毕业的大学生和我聊天&#xff0c;他现在网络工程专业大四&#xff0c;因为今年6、7月份的时候毕业&#xff0c;所以现在面临找工作的问题。不管是现在找一份实习工作&#xff0c;还是毕业后找一份正式工作&#xff0…...

主线程与子线程之间相互通信(HandlerThread)

平时&#xff0c;我们一般都是在子线程中向主线程发送消息&#xff08;要在主线程更新UI&#xff09;&#xff0c;从而完成请求的处理。那么如果需要主线程来向子线程发送消息&#xff0c;希望子线程来完成什么任务。该怎么做&#xff1f;这就是这篇文章将要讨论的内容。 一、…...

13基于双层优化的电动汽车日前-实时两阶段市场竞标

MATLAB代码&#xff1a;基于双层优化的电动汽车日前-实时两阶段市场竞标 关键词&#xff1a;日前-实时市场竞标 电动汽车 双层优化 编程语言&#xff1a;MATLAB平台 参考文献&#xff1a;考虑电动汽车可调度潜力的充电站两阶段市场投标策略_詹祥澎 内容简介&#xff1a;…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

网络编程(UDP编程)

思维导图 UDP基础编程&#xff08;单播&#xff09; 1.流程图 服务器&#xff1a;短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...