【问题标题】:Is Recursion W/Memoization In Staircase Problem Bottom-Up?楼梯问题中的递归 W/Memoization 是自下而上的吗?
【发布时间】:2019-11-05 13:23:19
【问题描述】:

将经典楼梯问题考虑为“戴维斯在他的房子里有许多楼梯,他喜欢一次爬每一个楼梯 1、2 或 3 级。作为一个非常早熟的孩子,他想知道有多少种方式到达楼梯的顶部。”

我的方法是使用递归作为记忆化

# TimeO(N), SpaceO(N), DP Bottom Up + Memoization
def stepPerms(n, memo = {}):

    if n < 3:
        return n
    elif n == 3:
        return 4

    if n in memo:
        return memo[n]
    else:
        memo[n] = stepPerms(n - 1, memo) + stepPerms(n - 2 ,memo) + stepPerms(n - 3 ,memo)
        return memo[n]

我想到的问题是,这个解决方案是自下而上还是自上而下。我的处理方法是,因为我们一直向下计算上 N 个值(想象一下递归树)。我认为这是自下而上的。这是正确的吗?

【问题讨论】:

    标签: algorithm topdown bottom-up


    【解决方案1】:

    递归策略通常是自上而下的方法,无论它们是否有记忆。底层算法设计是动态规划,传统上以自下而上的方式构建。

    我注意到您使用 python 编写代码,并且 python 通常对深度递归不满意(少量还可以,但性能很快就会受到影响,并且最大递归深度为 1000 - 除非它在我阅读)。

    如果我们制作一个自下而上的动态程序版本,我们可以摆脱这种重复,我们也可以认识到我们只需要恒定的空间,因为我们只对最后 3 个值真正感兴趣:

    def stepPerms(n):
        if n < 1: return n
        memo = [1,2,4]
        if n <= 3: return memo[n-1]
    
        for i in range(3,n):
            memo[i % 3] = sum(memo)
        return memo[n-1]
    

    请注意逻辑是多么简单,从 i 开始的 appart 比值小 1,因为位置从 0 开始而不是计数 1。

    【讨论】:

    • 在二叉树中,类似于我的算法的算法将被视为自下而上,因为结果是自下而上累积的,我假设 BT 和 DP 之间的术语不同?
    • 目标与结果的变化方式并没有你想象的那么大。二叉树的基本形式是自上而下的数据结构,因为它们是围绕自上而下方法分而治之的数据结构,尽管我记得的大多数分而治之算法都是从自下而上的属性设计的(因为合并是大多数分而治之算法的主要部分,它们围绕自下而上的属性)。使困惑?这是可以理解的,因为自下而上与自上而下实际上是关于如何在精神上分解问题,而不是严格的分类。
    【解决方案2】:

    在自顶向下的方法中,复杂的模块被划分为子模块。所以这是自上而下的方法。另一方面,自下而上的方法从基本模块开始,然后进一步组合它们。

    此解决方案的自下而上方法将是:

    memo{}
    
    for i in range(0,3):
       memo[i]=i
    memo[3]=4
    
    for i in range(4,n+1):
      memo[i]=memo[i-1]+memo[i-2]+memo[i-3]
    

    【讨论】:

    • 在二叉树中,类似于我的算法的算法将被视为自下而上,因为结果是自下而上累积的,我假设 BT 和 DP 之间的术语不同?
    • 在二叉树中,类似于您的示例的算法将被视为自下而上?我不这么认为!请阅读:quora.com/…
    • 这仍然不是二叉树,归并排序是那里的二叉树,如果你有 leetcode,请阅读这篇文章,你会明白我的意思,leetcode.com/explore/learn/card/data-structure-tree/17/…
    • 合并排序显然遵循二叉树方法。甚至是完整的二叉树方法。
    猜你喜欢
    • 2015-02-22
    • 2021-12-17
    • 2020-08-03
    • 2015-10-11
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    相关资源
    最近更新 更多