【问题标题】:All possible strings from a given alphabet给定字母表中所有可能的字符串
【发布时间】:2018-02-28 18:13:31
【问题描述】:

我正在尝试从给定的字母表(以列表的形式)生成所有可能的特定长度的字符串。

我尝试使用 iterools 方法(主要是 itertools.product),但即使它适用于小长度,但正如预期的那样,它非常昂贵,比如 n=100。我想我让它运行了大约 1 个小时,但它仍然没有完成。

在合理的时间范围内实现这一目标的最快方法是什么?

【问题讨论】:

  • 给定字母是什么意思?
  • 假设我们有 L=['a', 'b']。我们需要 L 中长度为 100 的所有可能组合。
  • 生成例如什么是合理的时间范围? 26 ** 100 字符组合?即使使用两个字符的字母表(想想二进制!),也有1,267,650,600,228,229,401,496,703,205,376 可能的输出。每输出 1ns,这是宇宙年龄的 2,900 倍(感谢Wolfram Alpha)。
  • 你计算过,你生成了多少个长度为100的组合?
  • 这样的字符串有 1,267,650,600,228,229,401,496,703,205,376 个。您不会任何合理的时间范围内迭代所有这些。你不是。接受它。

标签: python combinations


【解决方案1】:

如果您想从m 的字母集大小生成大小为n 的字符串,则不能比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=100m=26(小写英文字母集),您的输出将是 26**100 字符串长!

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多