自上而下和自下而上的动态编程之间有区别吗?


33

自上而下和自下而上的动态编程之间有根本区别吗?

特别是,是否存在可以自下而上但不能自上而下解决的问题?还是自下而上的方法只是消除了自上而下的方法的复发?

Answers:


27

要使用自底向上方法,您需要能够有效地确定“底”是什么,这通常意味着您需要一个严重受限的问题空间。如果您知道最低级别的计算是什么,并且依存关系的顺序是递增的,则以正确的顺序迭代地执行它们并存储这些结果是有意义的。分解的阶乘,朴素的斐波那契和欧拉递归关系都是适合此方法的好例子。

某些问题的计算底数或依存关系顺序不易确定。例如,国际象棋位置评估可以通过位置有效地记忆,并存储评估分数,因此无需重新计算。由于移动换位和重复,位置可能会在搜索树的多个级别重复出现,因此保存评估结果值得。但是无法不递归地下降(并考虑到中间修剪)就无法知道树最低层的位置,因此从上到下确实是唯一可行的方法。


4
  • 自上而下的方法:这是任何问题的递归公式的直接结果。如果可以使用子问题的解决方案来递归地提出任何问题的解决方案,并且如果子问题重叠,则可以轻松地将子问题的解决方案存储或存储在表中。每当我们尝试解决新的子问题时,我们都会首先检查表以查看是否已解决。如果已记录解决方案,则可以直接使用它,否则我们解决子问题并将其解决方案添加到表中。

  • 自下而上的方法:按照子问题递归地提出问题的解决方案后,我们可以尝试以自下而上的方式重新构造问题:尝试先解决子问题,然后使用其解决方案来构建-然后提出更大的子问题的解决方案。通常也以表格形式通过使用较小的子问题的解决方案迭代生成越来越大的子问题的解决方案来完成此操作。例如,如果我们已经知道F41和F40的值,则可以直接计算F42的值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.