n个不同数所有可能的出栈顺序及其引出的卡特兰数(catalan)
2014-03-08 20:13
393 查看
近日在复习数据结构,看到栈的时候,发现1个元素进栈,有1种出栈顺序;2个元素进栈,有2种出栈顺序;3个元素进栈,有5种出栈顺序,那么一个很自然地问题就是n个元素进栈,共有多少种出栈顺序?
说来惭愧,以前学数据结构的时候竟然没有考虑过这个问题。最近在看动态规划,所以“子问题”这3个字一直在我脑中徘徊,于是解决这个问题的时候我也是用类似“子问题”的方法,说白了就是递推公式。
我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出:
f(1) = 1 //即 1
f(2) = 2
//即 12、21
f(3) = 5 //即 123、132、213、321、231
然后我们来考虑f(4), 我们给4个元素编号为a,b,c,d, 那么考虑:元素a只可能出现在1号位置,2号位置,3号位置和4号位置(很容易理解,一共就4个位置,比如abcd,元素a就在1号位置)。
分析:
1) 如果元素a在1号位置,那么只可能a进栈,马上出栈,此时还剩元素b、c、d等待操作,就是子问题f(3);
2) 如果元素a在2号位置,那么一定有一个元素比a先出栈,即有f(1)种可能顺序(只能是b),还剩c、d,即f(2), 根据乘法原理,一共的顺序个数为f(1) *>
为了规整化,我们定义f(0) = 1;于是f(4)可以重新写为:
f(4) =>
f(n) =>
运行结果:
1 1 2 5 14 42 132 429 1430 4862 16796
58786 208012 742900 2674440 9694845 35357670 129644790 477638700
1767263190
请按任意键继续. . .
PS:
1、抽象出子问题后,使用动态规划“子问题”的分析方法值得借鉴
2、f(n)递推公式的复杂度为O(n2),卡特兰数列存在组合公式,计算复杂度为O(1)
3、数列呈指数规模增长
3、卡特兰数列的诸多应用,如矩阵链乘中的括号化问题,n个节点可以组成二叉树的种类,凸多边形划分三角形分法问题等等
说来惭愧,以前学数据结构的时候竟然没有考虑过这个问题。最近在看动态规划,所以“子问题”这3个字一直在我脑中徘徊,于是解决这个问题的时候我也是用类似“子问题”的方法,说白了就是递推公式。
我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出:
f(1) = 1 //即 1
f(2) = 2
//即 12、21
f(3) = 5 //即 123、132、213、321、231
然后我们来考虑f(4), 我们给4个元素编号为a,b,c,d, 那么考虑:元素a只可能出现在1号位置,2号位置,3号位置和4号位置(很容易理解,一共就4个位置,比如abcd,元素a就在1号位置)。
分析:
1) 如果元素a在1号位置,那么只可能a进栈,马上出栈,此时还剩元素b、c、d等待操作,就是子问题f(3);
2) 如果元素a在2号位置,那么一定有一个元素比a先出栈,即有f(1)种可能顺序(只能是b),还剩c、d,即f(2), 根据乘法原理,一共的顺序个数为f(1) *>
为了规整化,我们定义f(0) = 1;于是f(4)可以重新写为:
f(4) =>
f(n) =>
代码如下: [code]#include <iostream> #define N 20 using namespace std; int main() { //递归公式求卡特兰数列 int catalan ; catalan[0]=1; for (int i=1;i<N;++i) { catalan[i]=0; for (int j=0;j<=i-1;++j) { catalan[i]+=catalan[j]*catalan[i-j-1]; } } for (int k=0;k<N;++k) { cout<<catalan[k]<<"\t"; } cout<<endl; }
运行结果:
1 1 2 5 14 42 132 429 1430 4862 16796
58786 208012 742900 2674440 9694845 35357670 129644790 477638700
1767263190
请按任意键继续. . .
PS:
1、抽象出子问题后,使用动态规划“子问题”的分析方法值得借鉴
2、f(n)递推公式的复杂度为O(n2),卡特兰数列存在组合公式,计算复杂度为O(1)
3、数列呈指数规模增长
3、卡特兰数列的诸多应用,如矩阵链乘中的括号化问题,n个节点可以组成二叉树的种类,凸多边形划分三角形分法问题等等
相关文章推荐
- 指定栈的进栈顺序,输出所有可能的出栈顺序
- 卡特兰数---n 个元素顺序入栈,则可能的出栈序列有多少种
- 给定入栈顺序,输出所有可能出栈情况及所有情况的总数
- 出栈顺序 与 卡特兰数(Catalan)的关系
- 给定入栈顺序,求所有可能的出栈顺序
- DFS 遍历数组所有可能存在的出栈顺序
- 根据入栈顺序输出所有可能的出栈顺序 (Java)
- 对于给定的字符串,求其入栈后,所有可能的出栈顺序
- 顺序进栈乱序出栈的所有可能顺序之算法
- 给定入栈顺序,输出所有可能的出栈情况,并判断给定的序列是否为正确的输出序列
- 根据入栈顺序得出所有可能的出栈顺序(c++)
- 设元素入栈的顺序是1、2、3、…、n ,则所有可能的出栈序列共有几种
- 卡特兰数(Catalan)应用:输出所有N对合法括号序列和输出所有已知进栈序列的合法出栈序列
- python中几种不同类型的参数的区分及其定义时的顺序
- 给定一个入栈序列,求所有可能的出栈序列
- 入栈顺序为1,2,3,4,5出栈顺序不可能的顺序是什么
- 编号为 1 到 n 的 n 个元素,顺序的进入一个栈,则可能的出栈序列有多少种?[摘]
- 数据结构——栈—出栈顺序的可能情况
- 给定不同数字的集合,返回所有可能的排列。
- 比如“1,2,3....10”,1到10这10个数,显示他的所有可能组合情况(排列顺序无所谓)