[转]堆栈输出排列数目的计算

堆栈的输入和输出集中在一端,对于固定的输入序列,根据输出的时机的不同,获得的输出序列也不同。
如何准确的计算输出的排列的数目,以及如何生成排列,是需要考虑的问题。

当前共有两个问题:计数和生成排列。
先给出关于问题的具体的描述:假设有一输入序列为1到n升序,求堆栈可能的输出。

验证合法的法则:
首先寻找合法输出的形式。
假设输出序列是p1到pn。
则若pi已知,求pi+1可能的数是?
首先考虑一个实例:
123
输出可能是  123    132   213  231  321
若pi+1大于pi,则是可以的,因为pi在pi+1之后进入堆栈;
若pi+1小于pi,则pi+1一定是所有小于pi的数中没有出栈的最大的数  集合描述是{1 ...  pi} -  {pm|  m < i};

接着考虑是否有合适的递推关系:
假设an 是所有n的输出排列的集合, 则从an中去掉n之后的集合属于an-1;
可以通过以上的验证合法法则进行证明;

所以根据此可以得知: an能够通过an-1以某种形式构造出来.

考虑实际例子:
1
12   21
123  132  213  231  321
1234  1243   1324  1342  1432   2134  2143  2314  2341  2431  3214  3241  3421 4321

以上可知: 对于n可以放在an-1的某个排列的末尾;
如果n放在某个排列的中间, 则要求n之后的排列必须是降序的;
(可以根据合法性法则证明).

观察一下每次添加n时的规律:
每个排列最多有n中添加, 最少有两种添加;
排列             添加形式                            添加的个数
对于1      有  12  21                               2

对于 12   有  123  132                          2
对于21    有  213  231   321                3

对于123     1234   1243                       2           
132             1324   1342    1432          3
213             2134    2143                       2
231              2314    2341    2431        3
321             3214     3241     3421    4321     4

a1   = 1       a2    =   2     a3    =   5     a4   =  14
所以  an   =  an-1   +   3^(n-2)
所以 an   =   1  +   (3^(n-1)  -1)  /2;

 






作者:liyonghelpme 发表于2010/7/7 13:34:00 原文链接
阅读:522 评论:0 查看评论
posted @ 2010-07-07 13:34  liyonghelpme  阅读(285)  评论(0编辑  收藏  举报