栈的数学性质:n个不同元素入栈,出栈元素不同排列的个数的推导,卡特兰数(明安图数)的推导
栈的数学性质:n个不同元素入栈,出栈元素不同排列的个数的推导,卡特兰数(明安图数)的推导
前言:重在记录,可能出错。
这部分内容借鉴了网络上的一些内容。如:什么是卡特兰数?和怎么理解出栈顺序有多少种?(递推式的构造)。
一、结论
先说结论,设n个不同元素入栈,出栈元素不同排列的个数为\({f \left( n \right) }\),则\({f \left( n \right) }\)符合以下规律:
1. $ \color{red}{f \left( n \left) =\frac{{1}}{{n+1}}C\mathop{{}}\nolimits_{{\text{ }2n}}^{{\text{ }\text{ }n}}\right. \right. }$
2. \(\color{red}{f \left( n \left) ={\mathop{ \sum }\limits_{{i=1}}^{{n}}{f \left( i-1 \left) *f \left( n-i \right) \right. \right. }}\right. \right. }\)
3.\(\color{red}{f \left( n+1 \left) =\frac{{4n+2}}{{n+2}}f \left( n \right) \right. \right. }\)
二、推导
1.建立x,y平面直角坐标系。
假设一只小蚂蚁从原点(0,0)出发,将入栈看作向右移动一,出栈看作向上移动一。
当n个不同元素全部入栈、出栈后,有n次入栈和n次出栈,相当于小蚂蚁爬到(n,n)位置。
显而易得的,小蚂蚁共有\(\color{red}{C\text{ }\mathop{{}}\nolimits_{{2n}}^{{n}}}\)种不重复的前进路线(小蚂蚁共需移动2n次,选择其中的n次为向右移动一,则剩下的n次为向上移动一)。
分析,因为栈的特点是只允许在一端进行插入和删除,所以在执行出栈操作时,必须保证栈里存在元素,否则就会抛出栈空异常。即每一步操作,都需要保证此时出栈操作总数≤入栈操作总数。
反映到坐标系上,即小蚂蚁不能越过y=x线或者不能碰到y=x+1线。
显而易得的,对于会抛出异常的输出序列,当其首次抛出异常时,恰好首次出现入栈次数为m,出栈次数为m+1,剩余的入栈次数为n-m,出栈次数为n-m-1,后面的路线有\({C\text{ }\mathop{{}}\nolimits_{{2n-2m-1}}^{{n-m}}}\)种。
\({C\text{ }\mathop{{}}\nolimits_{{2n-2m-1}}^{{n-m}}}\),这是在2n-2m-1次操作中,选取n-m次为入栈操作的意思,显而易得的,这个组合数也可以表示在2n-2m-1次操作中,选取n-m次为出栈操作的意思。将n-m次入栈向右移动一,换成n-m出栈向上移动一,反映到坐标系,即将小蚂蚁首次碰到y=x+1后的路线关于y=x+1作对称。如下图:

小蚂蚁从(0,0)碰到y=x+1到终点(n,n)就相当于从(0,0)到终点(n-1,n+1)。因此,小蚂蚁所有碰到y=x+1的到(n,n)的路线数就相当于到(n-1,n+1)的路线数,即\(\color{red}{C\text{ }\mathop{{}}\nolimits_{{2n}}^{{n-1}}}\)种。
小蚂蚁从(0,0)到终点(n,n)且不碰到y=x+1的路线有
\]
综上,设n个不同元素进栈,出栈元素不同排列的个数为\({f \left( n \right) }\),则\(\color{red}{{f \left( n \right) }=\frac{{1}}{{n+1}}C\text{ }\mathop{{}}\nolimits_{{2n}}^{{n}}}\)。
2.假设n个不同元素为\({a\mathop{{}}\nolimits_{{1}}\text{ }a\mathop{{}}\nolimits_{{2}} \cdots a\mathop{{}}\nolimits_{{n}}}\),考虑最后一个出栈的元素是谁,是\({a\mathop{{}}\nolimits_{{i}}}\)。
\({a\mathop{{}}\nolimits_{{i}}}\)最后一个出栈,说明\({a\mathop{{}}\nolimits_{{i}}}\)始终在栈底,即当到\({a\mathop{{}}\nolimits_{{i}}}\)的时候,\({a\mathop{{}}\nolimits_{{1}}\text{ }\text{ }a\mathop{{}}\nolimits_{{2}} \cdots a\mathop{{}}\nolimits_{{i-1}}}\)全部完成了正常的入栈、出栈,给\({a\mathop{{}}\nolimits_{{i}}}\)留了一个空栈,这样的序列有\({f \left( i-1 \right) }\)种;
\({a\mathop{{}}\nolimits_{{i}}}\)进入栈底后,不动,此时的栈相当于底厚了一点的“空栈”,等\({a\mathop{{}}\nolimits_{{i+1}}\text{ }\text{ }a\mathop{{}}\nolimits_{{i+2}} \cdots a\mathop{{}}\nolimits_{{n}}}\)全部先完成正常的入栈、出栈,序列有\({f \left( n-i \right) }\)种。总共有\({f \left( i-1 \left) *f \left( n-i \right) \right. \right. }\)种序列。
综上,i的取值为1~n的正整数,所以\(\color{red}{f \left( n \left) ={\mathop{ \sum }\limits_{{i=1}}^{{n}}{f \left( i-1 \left) *f \left( n-i \right) \right. \right. }}\right. \right. }\)
3.我们先算出当n=1,n=2,n=3,n=4,n=5时的\({f \left( n \right) }\)的值,再总结规律,\({f \left( 1 \left) =1,f \left( 2 \left) =2,f \left( 3 \left) =5,f \left( 4 \left) =14,f \left( 5 \left) =42\right. \right. \right. \right. \right. \right. \right. \right. \right. \right. }\)这怎么看规律?就用眼珠子瞪,很简单啊,知道答案,硬凑就行了。!^.^!
\]
综上,$\color{red} {f\left( n+1 \left) =\frac{{4n+2}}{{n+2}}f \left( n \right) \right. \right.} $
栈的数学性质:n个不同元素入栈,出栈元素不同排列的个数的推导,卡特兰数(明安图数)的推导的更多相关文章
- 设计一个栈,设计一个max()函数,求当前栈中的最大元素
#include <iostream> using namespace std; #define MAXSIZE 256 typedef struct stack { int top; i ...
- flask 源码专题(三):请求上下文和应用上下文入栈与出栈
1.请求上下文和应用上下文入栈 # 将ctx入栈,但是内部也将应用上下文入栈 ctx.push() def push(self): # 获取到的 top == ctx top = _request_c ...
- JVM字节码之整型入栈指令(iconst、bipush、sipush、ldc)
官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html 原文地址:http://www.linmuxi.com/2016/02 ...
- [置顶] 栈/入栈/出栈顺序(c语言)-linux
说明: 1.栈底为高地址,栈顶为低地址. 2.入栈顺序:从右到左. 解释1:栈在内存中的结构 [注:0x00 到 0x04之间间隔4个地址] 入栈:指针先指向0x10,从高地址向低地址方向填数值,最终 ...
- 003-整型入栈指令(iconst、bipush、sipush、ldc)
一.概述 官网:http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html参考地址:http://www.linmuxi.com/201 ...
- Internet 校验和的数学性质
Internet 校验和(Checksum)仅计算头部的正确性,这一点很重要,这意味着 IP 协议不检查 IPv4 packet 有效载荷部分的数据正确性.为了保证有效载荷部分的正常传输,其他协议必须 ...
- n个元素的入栈顺序有多少种出栈顺序?
问题:w1.w2.w3.w4.w5,5个元素将会按顺序入栈,求出栈顺序有多少种情况. 先写一下结论方便记忆: 1个元素:1种 2个元素:2种 3个元素:5种 4个元素:14种 5个元素:42种 简单的 ...
- 问题-栈S最多能容纳4个元素,现有6个元素按A、B、C、D、E、F顺序进栈,问可能的出栈顺序。
住栈的特性:对于取出栈内元素每次只能从栈顶开始取(后进先出(栈满时,只能先出后进)) 由于栈内只能容纳4个元素: 所以 E F不可能第一个出栈: 当栈内少于四个元素时 既可以选择进栈,也可以选择出栈 ...
- C语言数据结构-链式栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-链式栈的实现-C语言 //链式栈的链式结构 typedef struct StackNode { int data; struct StackNode *next; } StackNod ...
- C语言数据结构-栈的实现-初始化、销毁、长度、取栈顶元素、查找、入栈、出栈、显示操作
1.数据结构-栈的实现-C语言 #define MAXSIZE 100 //栈的存储结构 typedef struct { int* base; //栈底指针 int* top; //栈顶指针 int ...
随机推荐
- windowserver中PowerShell禁止脚本执行的解决方法
最近工作中在上线项目的时候安装Exceptionless时,运行powershell脚本,发现报错: 报错提示:You cannot run this script on the current sy ...
- 微服务组件-----Spring Cloud Alibaba 注册中心Nacos的CP架构Raft协议分析
前言 本篇幅是继 注册中心Nacos源码分析 的下半部分. 意义 [1]虽说大部分我们采用注册中心的时候考虑的都是AP架构,为什么呢?因为性能相对于CP架构来说更高,需要等待的时间更少[相对于CP架 ...
- 图书管理系统、聚合函数、分组查询、F与Q查询
目录 图书管理系统 1.表设计 2.首页搭建.展示 书籍的添加 书籍编辑 书籍删除 聚合函数 Max Min Sum Count Avg 分组查询 按照表分组 按照字段分组 F与Q查询 F查询 Q查询 ...
- django.db.migrations.exceptions.NodeNotFoundError: Migration apitest.0001_initial dependencies reference nonexistent parent node ('product', '0001_initial')
执行python manage.py makemigrations时出现以下错误 D:\autotestplat>python manage.py makemigrations Tracebac ...
- [深度学习] 经典深度学习模型及其微调(Caffe)总结
目录 经典模型 Caffe预训练模型 经典模型 LeNet https://blog.csdn.net/kaido0/article/details/53161684 AlexNet https:// ...
- 【Java】线程池梳理
[Java]线程池梳理 前言 线程池:本质上是一种对象池,用于管理线程资源.在任务执行前,需要从线程池中拿出线程来执行.在任务执行完成之后,需要把线程放回线程池.通过线程的这种反复利用机制,可以有效地 ...
- python之路28 网络编程基础之OSI七层协议模型
OSI七层协议 """ 七层模型,亦称OSI(Open System Interconnection).参考模型是国际标准化组织(ISO)制定的一个用于计算机或通信系统间 ...
- 【力扣】787. K 站中转内最便宜的航班加权——有向图最短路径
前言 我感觉这题比较有代表性,所以记录一下,这题是加权有向图中求最短路径的问题. 题目 787. K 站中转内最便宜的航班 动态规划 假设有一条路径是[src, i, ..., j, dst],解法一 ...
- DBSCAN学习笔记
基本概念 核心点:若某个点的密度达到算法设定的阈值,即ε-邻域内点的数量(包括自己)不小于minPts,则该点为核心点. 边界点:在ε-邻域内点的数量小于minPts,但是落在核心点邻域内的点. 噪声 ...
- Arm-Linux子系统的互相Notify
前言: Linux下面不同的子系统一个个的组成了整个系统的运行环节,为了让这些子系统能够互相通讯,有一种叫做:notify chain(通知链)的东西.本篇看下. 概括 所谓通知链,有通知,就有执行的 ...