使用重复值编码排列

时间:2018-06-26 17:28:49

标签: algorithm combinations permutation combinatorics

我正在尝试在三个位置生成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

1 个答案:

答案 0 :(得分:1)

您要查找的特定组合似乎只是“每个位置上的A,B,C,D,E中的任何一个”。 在这种情况下,它们很像一个“五进制”(以5为底)positional numeral system:您有3个数字,并且每个数字都可以分别是0(A),1(B),2(C),3 (D)或4(E)。 将它们编码为整数也是如此:只需将它们从0编号为5 3 -1。

对于数字k,“组合”是“(k div 5 2 )mod 5,(k div 5 1 )mod 5,(k div 5 0 )mod 5,其中ABCDE分别编码为01234

对于“ xyz”之类的“组合”,首先将字母ABCDE映射到数字01234作为x,y和z,然后编码编号为x * 5 2 < / sup> + y * 5 1 + z * 5 0