编码具有重复值的排列

Encoding Permutations With Repeating Values

我正在尝试在三个位置生成 A、B、C、D、E 的所有组合:

A,A,A
A,A,B
C,A,E
C,B,A
C,B,B
etc...

我已经了解了阶乘数系统和组合数系统,但我仍然无法找到正确的实现方式。一般过去我都是用递归来解决这个问题,但是在这种情况下我不想生成整个列表来找到一个值,所以我需要一个编码。

理想情况下,我有一个用于组合的整数编码,因此我可以简单地调用一个带有迭代整数的函数来生成正确的排列。

还有这叫做什么,我如何才能了解更多关于方法变化的信息?我见过的一些类似的解决方案只生成非重复组合(ABC、ABD),其他的则不重用值。

根据我过去的递归方法,我的猜测是 permutation(0) 会导致 aaapermutation(100) 会导致 adw.

您要查找的具体组合似乎只是"any of A,B,C,D,E on each position"。 在这种情况下,它们非常类似于 "pentary"(基数 5)positional numeral system:您有三个数字,每个数字都可以独立地为 0 (A)、1 (B)、2 (C) 、3 (D) 或 4 (E)。 将它们编码为整数也是如此:只需将它们编号为 0 到 53-1.

对于数字 k,"combination" 是 "(k div 52) mod 5, (k div 51) mod 5, (k div 50) mod 5, 用ABCDE分别编码为01234

对于像"xyz"这样的"combination",首先将字母ABCDE映射到数字01234为x、y、z,然后编码数为x* 52 + y*51 + z*50.