Код, принимаемый навсегда, выполняется при определенных условиях.Нужно бежать быстрее - PullRequest
0 голосов
/ 19 сентября 2019

Этот код является частью задачи, которая требует от кода возврата перестановок строки без дубликатов.Код выполняется, но при некоторых трудностях он не проходит из-за временных ограничений, и я не знаю, как заставить его выполняться быстрее.

from itertools import permutations as perm

def permutations(string):
    permList = list(perm(string))
    joinedList = [''.join(tups) for tups in permList]
    ans = []
    [ans.append(x) for x in joinedList if x not in ans]
    return ans

Опять код выполняется для определенных примеров, но примеров с большимистрок и множества совпадений код занимает слишком много времени и не справляется с задачей.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2019

В идеале, вы должны сохранять выход в генераторе как можно дольше;оценка занимает время и пространство.

Здесь мы поддерживаем набор видимых элементов, чтобы избежать их повторной выдачи, сохраняя каждый из них уникальным.

import itertools

def unique_permutations(seq):
    seen = set()
    for p in itertools.permutations(seq):
        if p not in seen:
            seen.add(p)
            yield(p)

for p in unique_permutations('aaab'):
    print(p)
0 голосов
/ 19 сентября 2019

Если вы хотите предотвратить дублирование, используйте набор, а не списки.Ваш код работает вечно, потому что вы постоянно сканируете список, пока вставляете новые данные.Вместо этого вы можете выполнять поиск / замену

в постоянное время

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...