Python 如何有效地从大小n的列表中获得大小为{n,n-1,n-2,…1}的所有置换?

Python 如何有效地从大小n的列表中获得大小为{n,n-1,n-2,…1}的所有置换?,python,performance,permutation,Python,Performance,Permutation,我试图从一个列表中找到与列表大小相同或更小的所有排列 例如: >>>allPermutations([a,b]) [[a,b], [b,a], [a], [b]] >>> list(allPermutations('abc')) [('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a'), ('a', 'b'), (

我试图从一个列表中找到与列表大小相同或更小的所有排列

例如:

>>>allPermutations([a,b])
[[a,b], [b,a], [a], [b]]
>>> 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',)]
这是我目前用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代码也会对我有很大帮助。任何帮助都将不胜感激。提前谢谢

我非常确定您的
置换.add()
curSet.add()
fullSet.add()
调用将导致例程快速停止。如果不断更改数组的大小,分配的内存将“耗尽空间”,必须找到新位置。这意味着将复制整个阵列。然后再添加另一个元素-冲洗并重复


您需要计算所需元素的数量,并为此预先分配空间。因此,如果您有5个元素,则需要为最终结果分配(5!+5*4!+10*3!+10*2!+5)x 5个元素,而为中间结果分配更少的元素。然后填充这些数组,而无需四处乱洗内存块;这将大大加快速度。

可能会对所有可能大小的列表的所有排列进行迭代。澄清:

def all_permutations(input_list):
    for i in xrange(len(input_list)):
        sublist = input_list[:i]
        for variant in permutations(sublist):
            yield variant

以下方面应起作用:

from itertools import permutations

def allPermutations(seq):
    return (x for i in range(len(seq),0,-1) for x in permutations(seq, i))
例如:

>>>allPermutations([a,b])
[[a,b], [b,a], [a], [b]]
>>> 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',)]

这难道不比找到给定集合的动力集更难吗?因为这是一个类似的问题,订购加在上面。我只是出于好奇,因为我认为这就是他们所谓的“NP完全”问题。@Mariano谁是“他们”?简言之(非完全)一个NP完全问题是一个可以解决另一个NP完全问题的问题,该问题的翻译时间为多段逻辑。这与时间的复杂性无关,“他们”是了解这些东西的人,我不是其中的一部分,这就是我为什么要问的原因。谢谢你的解释。