当前位置: 首页 > 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;…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器&#xff1a;Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...