【问题标题】:How to write most efficient algorithm to find all possible permutation in list of strings如何编写最有效的算法来查找字符串列表中所有可能的排列
【发布时间】: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


【解决方案1】:

如果你真的只对排列的个数感兴趣,你可以使用memoization(动态编程):

import functools


@functools.lru_cache(maxsize=None)
def num_permutations_of_length(l, k):
    if k < 0:
        return 0
    elif k == 0:
        return 1
    total = 0
    for i in range(len(l)):
        total += num_permutations_of_length(l, k-l[i])

    return total


def main():
    print(num_permutations_of_length((1,2,4,8), 256))


if __name__ == '__main__':
    main()

只需输入字符串长度的元组,而不是字符串本身。

这个输出

1038196252619804983509071079561190746560608760522777019070489047

顺便说一句。

【讨论】:

  • 答案应该是867355878
  • 您的代码输出长度为 16 和 32 的正确答案,然后输出错误的长度为 64、128 等。
  • @Bob 听起来您的计算中有错误 - 867355878 对于您的问题中的示例来说太小了。
  • @杰弗里布伦特。这不是我的计算。那是测试的答案。
  • 根据 OP 对该问题的澄清,产生相同最终字符串但由不同部分组装的两种解决方案被认为是相同的。在这种情况下,单独的字符串长度对于一般情况来说是不够的,因为 ("A","AA") 的解决方案将不同于 ("A","BB") 的解决方案。跨度>
猜你喜欢
  • 2015-06-18
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
  • 2016-04-17
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多