假设以下符号集:[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]相同,因为同样,我们不知道将哪些颜色分配给哪些符号,我们所知道的是“最后一种颜色与前三种不同。”
这绝对是一种数学构造,比简单的排列更高级,我只是不知道它的名字。
[不要不考虑就这么快就将其消除。
这里是一个递归算法。关键思想是,要打破不同字母之间的对称性,只允许添加已使用的字母或first