【发布时间】:2020-11-20 00:55:54
【问题描述】:
下面的代码输出一个恒定长度的字符串列表中所有可能排列的数量,使用递归求解。假设list_1 = ["A"] 和list_2 = ["BB"] 的长度是5 那么:
所有可能的组合是:
A A A A A
A A A BB
A A BB A
A BB A A
BB A A A
A BB BB
BB A BB
BB BB A
现在,如果我将列表更改为 list_1 = ["A"], list_2 = ["BB"], list_3 = ["CCCC"], list_4 = ["DDDDDDDD"]
长度为 256。响应时间太长。我想知道如何加快代码速度。
list_1 = ["A"]
list_2 = ["BB"]
list_3 = ["CCCC"]
list_4 = ["DDDDDDDD"]
size = 256
strs = list_1 + list_2 + list_3 + list_4
res = []
def helper(strs, size, cur, res):
if size == 0:
res.append(cur)
return
if size < 0:
return
for s in strs:
helper(strs, size-len(s), cur+[s], res)
helper(strs, size, [], res)
print(len(res))
【问题讨论】:
-
当然响应时间太长了,排列太多了。
-
Applet123 所说的。即使您只包括了 list_1 和 list_2,并通过将 list_1 更改为“AA”进一步降低了可能性,这里计算的排列也将略多于 300000000000000000000000000000000000000 排列。不会发生。
-
如果变量只有一个字符串,为什么还需要使用列表来保存?
-
您的意思是将每个列表定义为字符串会显着改进代码?
-
我认为最有效的排列查找算法就是使用来自
itertools模块的内置permuations。如果只能使用一个,就不要重新发明轮子。
标签: python recursion combinations dynamic-programming itertools