使用Lehmer代码,可以使用因子数系统对N个元素序列的任何排列进行编码并映射到十进制数.
示例:
Lehmer代码ABCD
排列:
ABDC => 0010 CBAD => 2100 DCBA => 3210
这些inversions vectors
可以使用阶乘法转换为小数:
2100 => 2 x 3! + 1 x 2! + 0 x 1! + 0 x 0! => 2 x 6 + 1 x 2 + 0 x 1 + 0 x 1 => 14
因此CBAD
排列可以直接映射到数字14
.
我的问题是:
从映射到置换的数字,是否有一种计算有效的方法通过交换序列中的两个元素来生成与先前的置换不同的其他排列的数量?
示例:我们有4个(映射到ADBC
),我们想要交换前两个元素.结果是18(或DABC
).
4 => 18 0200 => 3000 ADBC => DABC
方法将如下声明:
swap(4, 0, 1); //return 18
我想避免再次完成整个过程但反过来:
Number => Factorial => Rebuild original permutation and swap elements (costly) => Factorial => Number
注意:在维基百科上有关于Steinhaus-Johnson-Trotter算法的文章, 但我不确定它会对此有所帮助.