我需要迭代整数元组的排列。顺序必须通过每步交换一对元素来生成。
我找到了Heap算法的维基百科文章(http://en.wikipedia.org/wiki/Heap%27s_algorithm),该算法应该可以做到这一点。伪代码如下:
procedure generate(n : integer, A : array of any):
if n = 1 then
output(A)
else
for i := 1; i ≤ n; i += 1 do
generate(n - 1, A)
if n is odd then
j ← 1
else
j ← i
swap(A[j], A[n])
我尝试在Python中编写了一个生成器:
def heap_perm(A):
n = len(A)
Alist = [el for el in A]
for hp in _heap_perm_(n, Alist):
yield hp
def _heap_perm_(n, A):
if n == 1:
yield A
else:
for i in range(1,n+1):
for hp in _heap_perm_(n-1, A):
yield hp
if (n % 2) == 1:
j = 1
else:
j = i
swap = A[j-1]
A[j-1] = A[n-1]
A[n-1] = swap
这将按以下顺序生成排列(对于输入[0,1,2,3]):
0,1,2,3
1,0,2,3
2,0,1,3
0,2,1,3
1,2,0,3
2,1,0,3
3,1,2,0
and so on
在最后一步时出现了问题,这不是仅交换一对的问题。
我做错了什么?
swap(A[j], A[n])
可以简单地实现为A[n],A[j] = A[j],A[n]
,这比使用临时变量进行多步操作更清晰。 - aruisdanteitertools.permutations()
不符合要求呢?对于你的输入示例,itertools.permutations([0,1,2,3])
会产生正确的输出样本。由于它是用C实现的,对于大型输入序列来说,速度会快得多。 - aruisdante