生成所有可能的组合效率低下

时间:2017-06-07 22:57:19

标签: python

生成数字列表的所有可能组合并使用特定总和获取组合的代码:

combos = []

for each in combinations_with_replacement(list, number):
    if sum(list(map(int, each))) == particular_number:
        combos.append(list(map(int, each)))

代码工作正常。但问题是如果函数 combinations_with_replacement 中的数字参数大于8,则需要花费大量时间。是否有一种优化的方式可以替换我的逻辑?

1 个答案:

答案 0 :(得分:1)

首先,退出重复工作。

  • 在进入循环之前将列表元素转换为整数。
  • 这个组合已经是一个元组;你真的需要将它转换为combos的列表吗?
  • 不要为各种列表长度生成所有组合,而是尝试使用"总和来定位的递归解决方案"搜索。这将极大地减少要尝试的列表数量。

递归解决方案的基本思想是:

# Given: remaining target sum and list of numbers (lon) to use
if target = 0:
    return []
if target < 0 or len(lon) == 0:
    return None

if target >= lon[0]:
    # add one of the first number; recur
    result = sum_to_target(target - lon[0], lon)
    return result + [lon[0]] if result else None

# Done with this number; try the rest of the list
result = sum_to_target(target, lon[1:])
return result if result else None

尝试使用和不使用列表的第一个数字的每个步骤。 如果超出目标或用完数字,则会失败。 如果您完全达到了目标,那么您就成功了:在爬行调用堆栈时构建有效的数字集。

请注意,我已经将所有解决方案连接起来作为练习的问题......以及一些调试和边界细节。