问题:
我想从固定长度的字符串中由字母和数字组成的36个字符生成所有可能的组合。假设术语“固定长度”是我的字符串长度的上限。
其中一些组合如下:
a
b
c
.
.
z
0
1
.
.
9
.
.
.
aaaaaa
aaaaab
.
.
99999999999999999998
99999999999999999999 // end of the list
我不想将它们存储在内存或磁盘中,因为我在它们上计算了一些东西,如果它们不符合目标结果,那么,我不再需要它。
方法:
1.对于第一次尝试,我选择递归来创建字符串。但是使用内存太糟糕了。
2.第二次尝试,我使用DFS算法,因为它在使用内存方面几乎是最佳的,因为它在 O(bm)附近。但是从时间的角度来看,这非常耗时。
还有其他方法可以更优化吗?
更新
这里可能有长度为2和3个字符的输出:
a
b
c
aa
ab
ac
ba
bb
bc
ca
cb
cc
答案 0 :(得分:2)
您可以使用itertools.product。它返回固定长度序列的生成器。
当您先按长度排序字符串,然后按字典顺序排序时,您可以使用类似的内容
import itertools
for l in range(1, 5):
for seq in itertools.product("abc", repeat=l):
print("".join(seq))
答案 1 :(得分:0)
不管算法如何,使用递归可能都是最简单的方法。不幸的是,您是对的,它可能需要大量的内存才能在每帧递归时打开。您甚至可能会达到递归限制。
我会检查Continuation Passing Style。这是一项优化,可以在执行大型递归工作时减少使用帧。它不会达到递归限制,可能会加快速度。我很确定Python支持此优化。这是一个高级主题,因此可能需要一些时间才能完成工作。
http://baruchel.github.io/blog/python/2015/07/10/continuation-passing-style-in-python/