为了账号安全,请及时绑定邮箱和手机立即绑定

自下而上和自上而下有什么区别?

自下而上和自上而下有什么区别?

自底向上方法(用于动态编程)包括首先查看“较小”的子问题,然后使用较小问题的解决方案解决较大的子问题。在自上而下的在于解决“自然地”的问题,并检查是否已计算出前解决的子问题。我有点困惑。两者有什么区别?
查看完整描述

3 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

自上而下和自下而上的DP是解决相同问题的两种不同方法。考虑一种用于计算斐波那契数的记忆(自上而下)与动态(自底向上)编程解决方案。


fib_cache = {}


def memo_fib(n):

  global fib_cache

  if n == 0 or n == 1:

     return 1

  if n in fib_cache:

     return fib_cache[n]

  ret = memo_fib(n - 1) + memo_fib(n - 2)

  fib_cache[n] = ret

  return ret


def dp_fib(n):

   partial_answers = [1, 1]

   while len(partial_answers) <= n:

     partial_answers.append(partial_answers[-1] + partial_answers[-2])

   return partial_answers[n]


print memo_fib(5), dp_fib(5)

我个人觉得记忆很自然。您可以采用递归函数并通过机械过程将其记忆化(首先在缓存中查找答案,并在可能的情况下返回它,否则以递归方式对其进行计算,然后在返回之前将计算结果保存在缓存中以备将来使用),而自下而上动态编程要求您对计算解决方案的顺序进行编码,这样在它依赖的较小问题之前就不会计算“大问题”。


查看完整回答
反对 回复 2019-10-04
  • 3 回答
  • 0 关注
  • 3996 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信