找到总和为特定值的所有子集。递归还是DP?

时间:2017-08-31 02:41:50

标签: algorithm recursion dynamic-programming memoization

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

给定一组数字:{1,3,9,12}并且目标值= 12.找到与目标值相加的不同子集。

:[3,9],[12]。

The problem has been asked here.

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

我的解决方案:DP更难,但消耗的内存更少。在递归中,您必须多次递归调用该函数,这会引入功能性。但它是#34;相当"更容易但消耗更多内存。

你们有什么想法?

2 个答案:

答案 0 :(得分:1)

通常,没有任何缓存的递归可以导致对可以用多项式或线性复杂度求解的问题的指数复杂性解决方案。那是因为你多次计算相同的部分问题。使用memoization的递归或迭代解决方案可以通过使用更多内存来降低复杂性。

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

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

答案 1 :(得分:1)

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

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

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

  1. '最佳子结构' - 通过使用其子问题的最优解,可以获得给定问题的最优解。
  2. '重叠子问题' - 多次使用相同子问题的解决方案。
  3. 上述2个属性是DP实现所必需的。否则DP不会给你任何优化。

    例如:大部分分而治之的方法都没有重叠子问题'属性。二进制搜索没有。

    希望它有所帮助!