我写的代码似乎看起来很糟糕,渐近测量运行时间和空间 我正进入(状态 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
答案 0 :(得分:2)
正如我在对该问题的评论中提到的,在一般情况下,由于n
个不同的字符,输入字符串有n!
个排列,因此您不会低于指数复杂度。 (2 n )是O(n!)的子集。
现在,以下内容不会改善一般情况的渐近复杂度,但是您可以优化蛮力方法,为具有多个出现次数的字符串生成所有排列。以字符串daedoid
为例;如果你盲目地产生它的所有排列,你会得到每个排列6 = 3!
次,因为你有三次出现d
。您可以通过首先消除同一个字母的多次出现来避免这种情况,而是记住使用每个字母的频率。因此,如果有一个字母c
出现k c ,您将保存k c !排列。总而言之,这为您节省了“产品超过k c !for all c”的因素。
答案 1 :(得分:0)
如果您不需要自己编写,请参阅itertools.permutations
和combinations
。