我正在尝试从给定的字母表中生成特定长度的所有可能字符串(以列表的形式)。
我尝试使用iterools方法(主要是itertools.product),但即使它适用于较小的长度,正如预期的那样,它非常昂贵,假设n = 100。我想我让它运行了大约1个小时仍然没有完成。
在合理的时间范围内实现这一目标的最快方法是什么?
答案 0 :(得分:0)
如果要从字母集大小n
生成大小为m
的字符串,则不能比Theta(m**n)
运行时更好(每个n
字母都可以是使用顺序编程模型的m
字母之一。
以下递归程序是一个实现(原则上由于递归深度需要O(n)
空间;从技术上讲,我们需要使用str_so_far
的字符串列表,因为虽然字符串在Python中是不可变的,但是是可变的):
def gen_strings(alpha_set, n):
def gen_strings_helper(str_so_far, n_remaining):
if n_remaining == 0:
all_strings.append(str_so_far)
return
for c in alpha_set:
gen_strings_helper(str_so_far + c, n_remaining - 1)
all_strings = []
gen_strings_helper('', n)
return all_strings
>>> gen_strings(['a', 'b'], 3)
['aaa', 'aab', 'aba', 'abb', 'baa', 'bab', 'bba', 'bbb']
为了加快速度,你应该研究并行编程模型。
但是,如果n=100
和m=26
(一组小写的英文字母),您的输出将为26**100
字符串长!