有没有一种算法可以列出所有的具有有限重复的排列?如果有现成的Java库,那就太好了!
假设我们有三个项目{A,B,C}
。我们希望得到两个项目的排列。这将是3P2:
{A, B}
{A, C}
{B, A}
{B, C}
{C, A}
{C, B}
如果我们允许最多重复两次,会是什么情况呢?(我不太清楚。)
我试图想象从集合{A, A, B, B, C, C}
中获取2个排列的情况。这将是6P2 = 30。但我们必须去掉那些重复的。我手动计算了一下,结果为9。我不知道如何用数学计算出9。
{A, A}
{A, B}
{A, C}
{B, B}
{B, A}
{B, C}
{C, C}
{C, A}
{C, B}
实际上,3P2重复2次不是一个好的例子。因为排列中只有2个元素,所以无限重复没有任何区别。4P3重复2次将是一个更好的例子。但是列出所有排列可能会很困难。
一个更好的例子是从集合{A,B,C,D}
中选择4P3:
{A, B, C}
{A, B, D}
{A, C, B}
{A, C, D}
{A, D, B}
{A, D, C}
... repeat for permutations starting from {B, ... }
... repeat for permutations starting from {C, ... }
... repeat for permutations starting from {D, ... }
在具有重复限制为2的集合{A,B,C,D}中,4P3 是多少:
{A, A, B}
{A, A, C}
{A, A, D}
{A, B, A}
{A, B, B}
{A, B, C}
{A, B, D}
{A, C, A}
{A, C, B}
{A, C, C}
{A, C, D}
{A, D, A}
{A, D, B}
{A, D, C}
{A, D, D}
... repeat for permutations starting from {B, ... }
... repeat for permutations starting from {C, ... }
... repeat for permutations starting from {D, ... }
这里有一个相关的网页,但它需要 nPn(选择所有元素)。此外,我仍然需要一种生成和列举排列的算法。
谢谢你的帮助!
对于程序实现,实际上有一种“不聪明”的方法。
对于集合{A,B,C,D}
,保留一个补充数组int used [0,0,0,0]
,它是每个元素使用次数的数字。每次选择一个元素时增加计数,并将数组的副本向前传递(沿着调用树)。然后按照这里所示的启发式递归方法进行修改,以允许无限重复(通过不删除从元素集中选择的元素),并在for
之后添加if (used [i] <= LIMIT)
检查语句。
这是“不聪明”的,也不够好,因为我们需要一个补充数组并要求每次都检查使用数量。
{A, B, C}
的排列(任意长度)并允许每个元素重复一次,是否与生成相同长度的{A, A, B, B, C, C}
的排列相同? - beaker{A, A, B, B, C, C}
的元素是不同的,即A != A
,那么它将是P(6, 3),但会出现重复的{A, A, B}
和{A, A, B}
,这是不想要的。 - midnite