编码具有重复值的排列
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)
会导致 aaa
而 permutation(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.
我正在尝试在三个位置生成 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)
会导致 aaa
而 permutation(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.