我试图从列表中找到与列表大小相同或更小的所有排列。
例如:
>>>allPermutations([a,b])
[[a,b], [b,a], [a], [b]]
这是我目前在python中的迭代代码。我不确定它目前的效率如何。
import itertools
def getAllPossibleSubSchedules( seq ):
fullSet = set()
curSet = set()
curSet.add(tuple(seq))
for i in reversed(range(1, len(seq) + 1)):
permutations = set()
for curTuple in curSet:
permutationsList = list(itertools.permutations(curTuple, i))
for permutation in permutationsList:
permutations.add(permutation)
curSet = set()
for permutation in permutations:
curSet.add(permutation)
fullSet.add(permutation)
return fullSet
我很确定算法会产生 n的总和!从1 - > n 排列很快就会增长。到目前为止,我已经创建了一种递归方式来执行它,这非常慢,因为它执行了许多重复操作。我一直试图通过迭代来做到这一点,但我无法弄清楚如何限制重复操作。我正在使用python但psuedo-code也会帮助我很多。任何帮助,将不胜感激。提前谢谢!
答案 0 :(得分:4)
以下内容应该有效:
from itertools import permutations
def allPermutations(seq):
return (x for i in range(len(seq),0,-1) for x in permutations(seq, i))
例如:
>>> list(allPermutations('abc'))
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('a',), ('b',), ('c',)]
答案 1 :(得分:0)
可能会迭代所有可能大小的列表的所有排列。澄清:
def all_permutations(input_list):
for i in xrange(len(input_list)):
sublist = input_list[:i]
for variant in permutations(sublist):
yield variant
答案 2 :(得分:-1)
我非常确定您的permutations.add()
和curSet.add()
以及fullSet.add()
来电会让您的日程快速停止。如果不断更改数组的大小,分配的内存将“空间不足”,并且必须找到新位置。这意味着整个数组被复制。然后你添加另一个元素 - 冲洗并重复。
您需要计算所需的元素数量,并为此预先分配空间。因此,如果你有5个元素,你需要为最终结果分配(5!+ 5 * 4!+ 10 * 3!+ 10 * 2!+ 5)x 5个元素 - 对于中间结果则少。然后你填充这些数组,而不是改组内存块;它会使事情变得更快。