从映射到排列的数字,如何生成与先前的perm不同的其他排列.通过交换元素?

 可爱嘟嘟豬5 发布于 2023-02-12 18:55

使用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算法的文章, 但我不确定它会对此有所帮助.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有