【问题标题】:Recursion and dynamic programming递归和动态规划
【发布时间】:2016-07-13 20:30:39
【问题描述】:

我知道每个可以使用动态规划求解的程序都可以使用递归求解,但反之亦然吗?如果可能的话,时间复杂度会有什么不同?

【问题讨论】:

  • 除非您说出“使用动态规划求解程序”对您意味着什么,否则无法真正回答。一般来说,它不是一个精确定义的东西。例如,对数组进行排序的程序使用动态编程意味着什么?
  • 我一般问它是否打印可以使用递归完成的字符串排列。可以使用动态规划来完成吗?

标签: algorithm recursion dynamic-programming


【解决方案1】:

反之亦然吗?

是的。

另一方面,如果你真的想问:

反之亦然吗?

那么合理地说答案是否定的。并不是所有可以用递归算法解决的问题都可以用动态规划合理地解决。我们只需要提出一个问题来突出这一点:排序。用递归算法很容易解决排序问题,但似乎没有合理的算法来解决动态规划的排序问题。不幸的是,我不得不在这里使用黄鼠狼这个词“合理”,因为你可以以某种方式强制使用动态编程来解决排序问题,这种方式非常尴尬且效率低下。

关于时间复杂度的问题无法回答。这取决于手头的问题,以及动态规划在解决问题时的适用性。

【讨论】:

  • 如果我们想找到可以使用递归计算的字符串的排列。用动态规划能解决同样的问题吗?
  • 一个问题必须具有两个关键属性,动态规划才能用于解决问题:重叠子问题和最优子结构。组合生成问题(查找字符串的排列)是否具有这两个关键属性?
  • 没有重叠子问题。所以这意味着它不能使用动态规划来解决?
  • @Xylene23 正如我在回答中所解释的那样,我不能说“使用 DP 无法解决”,因为可能存在 DP 算法来解决组合生成问题。这可能完全没有必要,但这并不意味着它是不可能的。
【解决方案2】:

如果 (1) 它具有最优子结构,即它是递归的,并且 (2) 它具有重叠的子问题,则可以使用动态规划来解决问题。因此,任何没有重叠子问题的递归问题都不能使用动态规划来解决。示例:插入排序,如果递归定义为 sorted_list[0:n] = sorted_list[0] + sorted_list[1:n]。

【讨论】:

    【解决方案3】:

    动态编程是时间与复杂性之间的权衡。您将一些信息存储在表中,因此如果您需要再次执行相同的操作,则无需重新计算它们。

    如果您的问题自然地分解为经常重复的子问题,那么动态规划是一个好主意。另一方面,如果没有重复出现的子问题,那么使用动态规划是没有意义的。

    【讨论】:

    • 并没有真正回答这个问题。问题与是否或何时“使用动态编程没有意义”无关。这是一个关于递归可解决的问题是否意味着它也可以使用动态规划来解决的理论问题。
    • 嗯,我确实说过。动态编程是否适用于一般递归问题取决于您是否需要在计算期间重新计算任何子问题。如果没有重复的子状态,则动态规划没有任何好处
    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 2020-11-20
    • 2014-06-26
    • 2013-11-14
    • 2012-07-10
    • 2011-11-09
    • 2013-10-09
    • 2012-09-20
    相关资源
    最近更新 更多