我刚开始使用动态编程。我想知道动态编程的哪个子类型适合Python - 自上而下或自下而上?这个问题专门针对Python,因为我想要处理语言特征。
有人告诉我,由于Python没有尾部调用消除,因此Top Down子类型可能不会更好,因为它基于递归并为每次递归创建新帧。因此,它可能会渐进地增加时间复杂度。 Bottom Up中的情况并非如此。我仍然无法确定哪个DP子类型最适合Python。您能否根据空间和时间费用以及复杂性向我提出建议?
修改:为了澄清我的问题,我添加了一些示例。我在这里试过斐波那契。
def top_down(n, memo={}):
if n == 0 or n == 1:
return n
elif n in memo:
return memo[n]
else:
memo[n] = top_down(n-1, memo) + top_down(n-2, memo)
return memo[n]
def bottom_up(n):
a, b = 0, 1
for _ in range(n-1):
a, b = b, a+b
return b
在此之后,我写了两篇timeit
。结果如下。
>>> timeit.timeit('memo.clear(); top_down(100, memo);', setup, number=100000)
6.46689930770529
>>> timeit.timeit('bottom_up(100);', setup, number=100000)
0.9449206890500932
这些是测试用例,我跑了。最上面一个清除memo
每次运行。较低的一个是bottom_up
实现,占用时间的1/6,效率是后者的6倍。这就是我的意思。人们可以看到他们的运行时间之间的明显差异。我已经尝试了许多其他问题,而且Bottom Up实现似乎总是更快。
感谢。