字典序问题-递归与分治

1.《字典序问题-递归与分治》何谓字典序问题

何谓字典序?我们拿3个数(1,2,3)来讲述。

字典序值012345
排列123132213231312321

3个数的全排列情况有有3!种情况,字典序即从小到大的顺序。按字典序给所有的情况从小到大排列,最小的设字典序值为0。

字典序问题是,随意给出一个序列,要求求出该序列的字典序值。比如说给出序列231,我们要设计算法返回3。一个延伸的问题是如果该序列不是最大序列,求出该序列的后一个序列。

2.如何求字典序值

从上面的简例看出,想求得给定序列的字典序值,我们要先求得该序列前面存在多少个序列。这可以通过从高位开求统计比该序列位小的序列数目求得。

对于序列231,n=3,前面的序列数可以通过百位2、十位3求得,即为:

1*(n-1)!+1*(n-2)!=3,

我们就知道231的字典序值为3。

对于序列453261,n=6,前面的序列数可以通过高5位求得,即为:

3*(n-1)!+3*(n-2)!+2*(n-3)!+1*(n-4)!+1*(n-5)!=447,

同样,我们知道453261的字典序值为447。

3.如何求得下个序列

我们知道,如果题目所给序列是最大序列,即其字典序值为n!,则没有下一个序列;否则,要求下个序列。下个序列的求解也有规律可循的。

求下个序列,可以从低位逐个往高位看。只要相邻的两个数高位比低位还小,从低位到高位出现了降序排列,则我们停下来分析。

例如,对于序列453612,1比2小,出现降序,所以停下来分析。我们可以肯定下一个序列高位和本序列一样,低位序列是比12刚刚大的序列。目测可以得到下一个序列低位为21,即max{1,2}放在低位的最高位,低位中剩下的元素按升序排列。

再拿一个例子来说明。对于序列536421,直到遍历到3比6小时才停下来。我们得到高位序列为5,低位序列为36421。对于低位序列36421,我们把次高位放到最高位上,剩下的元素按增序排列,即可得到序列61234。61234是否是36421的下一个序列?很显然是的。

    原文作者:递归与分治算法
    原文地址: https://blog.csdn.net/fsz521/article/details/7570061
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞