2013-03-28 2 views
-1

Код, который я написал, кажется, выглядит плохо с асимптотической мерой времени и пробега Я получаю T (N) = T (N-1) * N + O ((N-1!) * N), где N - размер ввода. Мне нужно посоветовать, чтобы оптимизировать егоПереведите строку, чтобы напечатать все возможные слова

Поскольку это вопрос интервью алгоритм, основанный мы должны реализовать логику наиболее эффективным способом, без использования каких-либо библиотек

Вот мой код

def str_permutations(str_input,i): 
    if len(str_input) == 1: 
     return [str_input] 
    comb_list = [] 
    while i < len(str_input): 
     key = str_input[i] 
     if i+1 != len(str_input): 
      remaining_str = "".join((str_input[0:i],str_input[i+1:])) 
     else: 
      remaining_str = str_input[0:i] 
     all_combinations = str_permutations(remaining_str,0) 
     for index,value in enumerate(all_combinations): 
      all_combinations[index] = "".join((key,value)) 
     comb_list.extend(all_combinations) 
     i = i+1 
    return comb_list 
+1

Не могли бы вы решить отношение повторения? Я забыл, как это сделать. Кроме того, когда вы говорите «переставить ... для печати всех ... комбинаций», я предполагаю, что вы на самом деле не подразумеваете комбинации (поскольку существует только 1 n-комбинация набора n элементов), и вместо этого вы имеете в виду все перестановки? Учитывая, что есть n! перестановки строки над n различными (!) буквами, вы не получите ниже экспоненциальной сложности в общем случае (ни время, ни пробел); однако вы можете подсчитать для каждого символа количество появлений до фактического создания перестановок. –

+0

Скажите k_i - количество появлений буквы i в вашей строке; подсчитывая видимость заранее (линейное время и пространство с использованием гистограммы), вы сохраните коэффициент «продукт над k_i! для всех символов i в строке» (обратите внимание на факториал). –

+0

@ G.Bach спасибо за ответ, я догадываюсь, что трудно повторить решение, но я согласен с u, что, поскольку вопрос требует всех перестановок, он не может быть меньше n! и определенная сложность для запуска программы, но время работы моей программы выглядит очень плохо, я думаю, – Sandy

ответ

2

Как я уже говорил в комментарии к этому вопросу, в общем случае вы не получите ниже экспоненциальной сложности, так как для n различных персонажей, есть n! перестановки строки ввода и вывода (2 п) является подмножество O (n!).

Теперь следующее не улучшит асимптотическую сложность для общего случая, но вы можете оптимизировать подход грубой силы для создания всех перестановок для строк, содержащих несколько символов с несколькими вхождениями. Возьмем, например, строку daedoid; если вы вслепую произвели все перестановки, вы получите каждую перестановку 6 = 3! раз, так как у вас есть три вхождения d. Вы можете избежать этого, сначала исключив несколько вхождений одной и той же буквы и вместо этого вспомнив, как часто использовать каждую букву. Так что если есть письмо c, которое имеет k c вхождениях, вы сохраните k c! Перестановки. Таким образом, в общем, это экономит вам фактор «продукта над k c! Для всех c».

+0

, это хороший момент спасибо! – Sandy

0

Если вы не нужно писать самостоятельно, см. itertools.permutations и combinations.

+0

спасибо @John за ссылку, которую я прочитаю через них, но так как это вопрос с интервью, нам нужно написать логику – Sandy

Смежные вопросы