顺序进栈乱序出栈的所有可能顺序之算法

题目:设有编号为1,2,3,4的四辆列车,顺序进入一个栈式结构的车站,具体写出这四辆 列车开出车站的所有可能的顺序。
今天看到这个数据结构练习题,一开始认为只有穷举然后验证的方法。
习题后面给出的答案:
至少有14种。
①全进之后再出情况,只有1种: 4,3,2,1
②进3个之后再出的情况,有3种,3,4,2,1 3,2,4,1 3,2,1,4
③进2个之后再出的情况,有5种,2,4,3,1 2,3,4,1 2,1,3,4 2,1,4,3 2,3,1,4
④进1个之后再出的情况,有5种,1,4,3,2 1,3,2,4 1,3,4,2 1,2,3,4 1,2,4,3

1-4的所有排列组合有n=4!=24种,然后我们需要依照下面的规律进行筛检:
例3,4,2,1
3后面比3小的数字有1和2,那么出栈的顺序必然是2,1,倒序排列
4后面比4小的是2和1,倒序
2后面比2小的是1,不需要检查
1是最后一个也不需要检查
上面所有的序列都满足上述的规律
如果是3,4,1,2,明显可以检查到时序列是不符合实际,错误的。
然后如果通过代码实现,光排列组合时间复杂度就需要O(n!),而筛检是否合适也几乎是O(n!),最终的时间复杂度几乎是O(n! * n!)。在n数值较大时几乎是不现实的。
我分析了规律,通过递归的方式进行了优化,简化到O(n*n)。

当n=1时,只有k(k=1)种可能;
n=1 序列中位置 k 对下一编号的影响
a 1

当n=2时,可以将编号2的列车插到编号1的列车的两边,(a)1(b);
n=2 序列中位置 k 对下一编号的影响
a 1
b 1 (a, 1):表示编号3列车插在a位置时有1种序列需要排除
(a):插到a位置时序列号为2,1,有1种可能。因为是倒序,所以下一次编号3列车放到任何位置都是可以的。
(b):插到b位置时序列号为1,2,有1种可能。下次3列车插到a位置是不可以的。
故整理得,n=2时排列组合有2种;
编号3列车(a)x(b)y(c),在放到(a)时,有1种序列不合理。

当n=3时,编号3列车有3个位置可以插入,(a)x(b)y(c)。
n=3 序列中位置 k 对下一编号的影响
a 2-1=1
b 2 (a, 2):表示编号4列车插在a位置时有2种序列需要排除
c 2 (a-b, 2):表示编号4列车插在a位置时有2种序列需要排除且
插在b位置时有2种序列需要排除
故整理得,n=3时排列组合有1+2+2=5种;
编号4列车(a)x(b)y(c)z(d),在放到(a)时,有2+2=4种序列不合理,
在放到(b)时,有2种序列不合理。

当n=4时,编号4列车有4个位置可以插入,(a)x(b)y(c)z(d)。
n=4 序列中位置 k 对下一编号的影响
a 5-4=1
b 5-2=3 (a, 3)
c 5 (a-b, 5)
d 5 (a-c, 5)
故整理得,n=4时排列组合有1+3+5+5=14种;
编号5列车(a)x(b)y(c)z(d)m(e),
在放到(a)时,有3+5+5=13种序列不合理,
在放到(b)时,有5+5=10种序列不合理,
在放到(c)时,有5种序列不合理。
求出的值和穷举的是一样的。

当n=5时,编号5列车有5个位置可以插入,(a)x(b)y(c)z(d)m(e)。
n=5 序列中位置 k 对下一编号的影响
a 14-13=1
b 14-10=4 (a, 4)
c 14-5=9 (a-b, 9)
d 14 (a-c, 14)
e 14 (a-d, 14)
故整理得,n=5时排列组合有1+4+9+14+14=42种;
编号6列车(a)x(b)y(c)z(d)m(e)n(f),
在放到(a)时,有4+9+14+14=41种序列不合理,
在放到(b)时,有9+14+14=37种序列不合理,
在放到(c)时,有14+14=28种序列不合理,
在放到(d)时,有14种序列不合理。

猜你喜欢

转载自blog.csdn.net/qq_42194192/article/details/82717131