如何确定一个集合的所有排列,带有重复的符号,但*没有*“功能相同”的集合

问题描述 投票:0回答:1

假设以下符号集:[A,B,C]

假定以下结果集大小为4。

我想产生所有排列的列表,带有重复的符号,但没有“功能相同”的项目。

即:[A,A,A,A]与[B,B,B,B]在功能上相同,因此[B,B,B,B]应该不是在最终结果中等

我尝试生成完整的3 ^ 4种可能性,然后“旋转符号”,一个接一个地检查是否存在重复项,然后将其删除,但是我意识到这并不适用于“两个符号互换”的情况,当然,当增加符号数量和设置大小时,还有很多其他我无法解释的“符号交换”情况。另外,似乎“生成最坏的情况然后修剪”是一种可怕的算法,我敢肯定还有更好的方法。

这里是预期输出的手动生成结果:

['A', 'A', 'A', 'A']
['A', 'A', 'A', 'B']
['A', 'A', 'B', 'A']
['A', 'A', 'B', 'B']
['A', 'A', 'B', 'C']
['A', 'B', 'A', 'A']
['A', 'B', 'A', 'B']
['A', 'B', 'A', 'C']
['A', 'B', 'B', 'A']
['A', 'B', 'B', 'B']
['A', 'B', 'B', 'C']
['A', 'B', 'C', 'A']
['A', 'B', 'C', 'B']
['A', 'B', 'C', 'C']

(当然,在某些时候,我想扩展符号集的大小和结果集的大小,以查看得到的结果。)

(首选语言是python,但我并不挑剔,我只是想了解算法)

编辑:让我澄清我对“功能相同”的定义。本质上,最重要的是结果的“拓扑”。例如,假设一旦生成集合,便将随机颜色分配给符号。

[[A A A A]只是意味着“所有项目都是相同的颜色”,因此[B B B B B]在功能上是相同的。两者之间没有区别,因为我们不知道将为A或B分配什么随机颜色,我们所知道的是它们都是相同的颜色。

另一个例子:[A A A B]在功能上与[B B B C]相同,因为同样,我们不知道将哪些颜色分配给哪些符号,我们所知道的是“最后一种颜色与前三种不同。”

这绝对是一种数学构造,比简单的排列更高级,我只是不知道它的名字。

[不要不考虑就这么快就将其消除。

python combinatorics
1个回答
2
投票

这里是一个递归算法。关键思想是,要打破不同字母之间的对称性,只允许添加已使用的字母或first

© www.soinside.com 2019 - 2024. All rights reserved.