1.何谓字典序问题
何谓字典序?我们拿3个数(1,2,3)来讲述。
字典序值 | 0 | 1 | 2 | 3 | 4 | 5 |
排列 | 123 | 132 | 213 | 231 | 312 | 321 |
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的下一个序列?很显然是的。