栈的数学性质: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 ...
随机推荐
- global与nonlocal、函数名用法、闭包函数、装饰器
今日内容回顾 目录 今日内容回顾 global与nonlocal 函数名的多种用法 闭包函数 装饰器简介 装饰器推导流程 装饰器模板 装饰器语法糖 练习 global与nonlocal 函数名的多种用 ...
- tomcat下找不到运行的程序文件
1.重新部署tomcat(删掉原有的tomcat) 2.更改部署路径
- windows装机小经验
小白的装机之路 大学时有试过自己用硬盘装,但只知其然,不知其所以然,真出现什么问题也不知道怎么解决,作为一名码农还是好好补补知识,免得以后被人笑话. 经过自己的看各路大神文章,试验并总结以下粗浅见解. ...
- 记一个难以发现的 UB
观察以下代码: vector<int> X, Y, A, val; inline int ls(int p) { return p << 1; } inline int rs( ...
- 获取对象的方式-Calendar类的常用成员方法
获取对象的方式 java.utiL.calendar类:日历类caLendar类是一个抽象类,里边提供了很多操作日历字段的方法(YEAR.MONTH.DAY_OF_MONTH.HOUR )CaLend ...
- 前端基础知识-react(一)个人学习记录 _
待补充 reactive和ref
- 分布式事务 | 使用DTM 的Saga 模式
DTM 简介 前面章节提及的MassTransit.dotnetcore/CAP都提供了分布式事务的处理能力,但也仅局限于Saga和本地消息表模式的实现.那有没有一个独立的分布式事务解决方案,涵盖多种 ...
- chatGPT vscode 体验
体验秘钥 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 多人用可能有点卡,重在体验. 自己(中国)想注册账号如下 步骤一:找到入口 搜索Ope ...
- Monkey 命令
1) 参数: -p 参数-p用于约束限制,用此参数指定一个或多个包(Package,即App).指定 包之后,Monkey将只允许系统启动指定的APP.如果不指定包,Monkey将允许系统启动设备中 ...
- 822. 走方格(acwing)
题目: 先讲变量 n:右下角的x值 m:右下角的y值 ans:答案(有几种可能) a数组:用来存储向下和向右的动作. x:所在的位置的x值 y:所在位置的y值 x1:下一步可以走到位置的x值 y1:下 ...