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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lm19880204/article/details/51995584
题目:设有编号为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种序列不合理。
总结:简化后时间复杂度为o(n*n),本人初学数据结构,不清楚有没有更好的方法,请各位大神指教啊!
展开阅读全文

没有更多推荐了,返回首页