【发布时间】:2018-06-23 14:58:02
【问题描述】:
我编写了一个函数,它返回一个包含重复字符串的所有可能“产品”的列表(用于拼写检查程序):
def productRepeats(string):
comboList = []
for item in [p for p in product(string, repeat = len(list(string)))]:
if item not in comboList:
comboList.append("".join(item))
return list(set(comboList))
因此,当print(productRepeats("PIP"))被输入时,他的输出是(我不管顺序是什么):
['PII', 'IIP', 'PPI', 'IPI', 'IPP', 'PPP', 'PIP', 'III']
但是,如果我尝试任何大于 5 位 (PIIIIP) 的内容,则输出大约需要 30 秒,即使只有 64 种方式
有什么方法可以加快速度,例如,获取字符串“GERAWUHGP”的列表需要半个多小时?
【问题讨论】:
-
使
comboList成为set,所以查找是O(1),而不是O(n)。 -
@user3483203:实际上,按照编写的代码,OP确实需要转换为
set,因为他们正在测试item in comboList,但添加了@ 987654328@ 到comboList,因此他们的检查实际上并没有过滤掉任何重复项。 -
请注意,您的产品规模增长得如此之快,以至于您的方法对于现实世界中的非平凡字符串来说不是很实用。我的意思是,“实用”这个词不是一个而是两个重复的字母,它会仍然生成一个 40M 长的列表。像“重复”这样的词将有一个超过 3.87 亿长的列表,如果你将它们全部实现,这将需要几分钟来生成和 20G 的内存。