Я пытаюсь найти все перестановки из списка того же размера или меньше, чем список.Как получить все перестановки размеров {n, n-1, n-2, ... 1} из списка размера n эффективно?
Например:
>>>allPermutations([a,b])
[[a,b], [b,a], [a], [b]]
Это итеративный код, который я в настоящее время в питона. Я не уверен, насколько он эффективен в настоящее время.
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
Я уверен, что алгоритм будет производить суммирование п! от 1 -> n перестановки, которые быстро растут. До сих пор я создал рекурсивный способ сделать это, что невероятно медленно, потому что он выполняет много повторных операций. Я пытался сделать это с помощью итерации, но я не могу понять, как ограничить повторные операции. Я использую python, но psuedo-код также мне очень помог. Любая помощь будет оценена по достоинству. Заранее спасибо!
Не будет ли это сложнее, чем найти Powerset данного набора? Поскольку это аналогичная проблема с добавлением дополнений к этому. Я просто спрашиваю из любопытства, потому что я думаю, что это то, что они называют «NP-полной» проблемой. – Mariano
@ Мариано, которые являются «их»? Короче говоря (неполная) проблема NP-complete - проблема, которая может решить еще одну NP-полную проблему с временем полилогического перевода. Это не имеет никакого отношения к сложности времени. – kay
«Они» - это люди, которые знают об этом, группа, в которой я не участвую, поэтому я и спросил. Спасибо за ваше объяснение. – Mariano