用Python编写更快的回溯算法

时间:2018-12-06 18:05:28

标签: python recursive-backtracking

我正在学习回溯算法,并且编写了一个子集总和的程序。这是程序:

items = range(1, 10)
result = []
def backtracking(array, target, temparray= []):
    if target == 0:
        result.append(temparray)
        return

    for index, item in enumerate(array):
        if item > target:
            return
        temparray.append(item)
        backtracking(array[index+1:], target - item, temparray[:])
        temparray.pop()
    return

backtracking(items, 8)
[print(arr) for arr in result]

从1到9的值中得到8的总和(无重复),我们得到以下输出:-

[1, 2, 5]
[1, 3, 4]
[1, 7]
[2, 6]
[3, 5]
[8]

输出很好,但是当我对50以上的任何数字执行相同的操作时,它会像永远一样继续运行。我等待了将近一个小时,但仍然无法获得结果,因此不得不突然终止程序。当值趋于接近40-50时,我对其他backtracking问题的经验也是如此。似乎backtracking本质上非常慢,因为它涉及recursion和许多function calls

我想问一下在实施backtracking algorithms时是否有什么可以总体上加快速度的。是否还有其他更有效的algorithms可以代替它使用。 Memoization不能作为列表使用,因为参数不可散列。

我为欧拉计划中的一些问题设计了一些很酷的解决方案,但无法获得更大价值的答案。我知道我的算法正确,但是速度很慢。 请帮忙。

0 个答案:

没有答案