【问题标题】:find all subsets that sum to a particular value. Recursion or DP?找到总和为特定值的所有子集。递归还是DP?
【发布时间】:2017-08-31 02:41:50
【问题描述】:

找出总和为特定值的所有子集。

给定一组数字:{1, 3, 9, 12} 和目标值 = 12。找到总和为目标值的不同子集。

回答:[3,9],[12]。

The problem has been asked here.

显然有两种方法可以解决这类问题。递归或DP。 问题:您如何权衡这两种方法?

我的解决方案:DP 更难,但消耗的内存更少。在递归中,您必须多次递归调用该函数,这引入了函数开销。但它“相当”容易,但会消耗更多内存。

你们觉得呢?

【问题讨论】:

  • DP 实际上消耗了 更多 内存,但它可以让您大量减少冗余(不必要的重复)计算的数量。

标签: algorithm recursion dynamic-programming memoization


【解决方案1】:

我猜 DP 可以根据方法(自上而下或自下而上)通过递归或迭代来实现。 通用递归解决方案和 DP 之间的主要区别在于是否使用额外的内存,这将是算法运行时的权衡。从根本上说,您通过存储和引用它来避免额外的计算。

对于泛型递归或DP的问题,将在DP中使用的内存与泛型递归中的运行时之间进行权衡。

要考虑的另一件事是,并非所有问题都符合 DP 方法。 正在考虑的问题,具有以下性质

  1. 'Optimal Substructure' - 给定问题的最优解可以通过使用其子问题的最优解来获得。
  2. “重叠子问题”- 多次使用相同子问题的解决方案。

以上 2 个属性对于 DP 实现是必需的。否则DP不会给你任何优化。

例如: 大多数分治法没有“重叠子问题”属性。二分搜索没有。

希望对你有帮助!

【讨论】:

    【解决方案2】:

    一般来说,没有任何类型的缓存的递归可能会导致问题的指数复杂度解决方案可以通过多项式或线性复杂度来解决。那是因为您多次计算相同的局部问题。使用memoization 的递归或迭代解决方案可以通过使用更多内存来降低复杂性。

    话虽如此,您需要考虑输入的限制因素。对于更大的输入,指数解决方案通常是无用的,因此您没有太多选择。同时,在大多数情况下使用额外的内存并不是真正的问题,除非您为内存非常有限的系统(如嵌入式系统)开发一些东西。

    总而言之,在大多数情况下,您可能希望权衡内存以支持算法复杂性,但您需要根据具体情况来决定。

    【讨论】:

      猜你喜欢
      • 2013-08-20
      • 2016-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 2021-11-22
      • 1970-01-01
      相关资源
      最近更新 更多