动态编程的哪个子类型适合Python - 自上而下或自下而上?

时间:2016-05-29 16:46:49

标签: python dynamic-programming

我刚开始使用动态编程。我想知道动态编程的哪个子类型适合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实现似乎总是更快。

感谢。

0 个答案:

没有答案