我正在寻找一种方法来生成一个元素列表的所有可能的排列。类似于python的itertools.permutations(arr)
permutations ([])
[]
permutations ([1])
[1]
permutations ([1,2])
[1, 2]
[2, 1]
permutations ([1,2,3])
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
不同的是,我不关心排列是按需生成(就像Python中的生成器)还是一起生成。我也不关心它们是否按字典顺序排序。我所需要的就是以某种方式得到这些n!
排列。
7条答案
按热度按时间uxhixvfz1#
有很多算法可以生成排列。最简单的例子是Heap's algorithm:
它通过选择一对要交换的元素来从前一个置换生成每个置换。
在上面的链接中概述了一个接一个地打印排列的想法和伪代码。下面是我的算法实现,它返回所有的排列
下面是一个如何使用它的例子(Go playground):
需要注意的一点是,排列不是按字典顺序排序的(正如您在
itertools.permutations
中看到的那样)。如果出于某种原因,你需要对它进行排序,我发现的一种方法是从factorial number system生成它们(在permutation section
中描述了它,并允许快速找到第n个字典排列)。**P.S.**你也可以看看其他人的代码here和这里
ee7vknir2#
下面的代码迭代了所有的排列,而没有先生成它们。切片
p
将中间状态保持为Fisher-Yates混洗算法中的偏移。这有一个很好的性质,即p
的零值描述了单位置换。4szc88ey3#
wtzytmuj4#
在我的例子中,我引用了一个数组,然后我在你的例子中做了一些修改:
qmelpv7a5#
另一个工作代码
m528fe3b6#
下面是另一个变体:
8yparm6h7#