我正在学习回溯算法,并且编写了一个子集总和的程序。这是程序:
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
不能作为列表使用,因为参数不可散列。
我为欧拉计划中的一些问题设计了一些很酷的解决方案,但无法获得更大价值的答案。我知道我的算法正确,但是速度很慢。 请帮忙。