2017-08-31 67 views
0

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

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

ANS:[3,9],[12]。

The problem has been asked here.

明明有解决这种问题的两种方法。递归或DP。 问题:你如何权衡这两种方法?

我的解决方案:DP比较困难,但消耗的内存较少。在递归中,你必须多次递归地调用该函数,这引入了头部功能。但它“相当”容易,但消耗更多的内存。

你们认为什么?

+1

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

回答

0

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

这就是说,你需要考虑你的输入的约束。对于更大的输入,指数解决方案通常是无用的,所以你没有太多的选择。同时,在大多数情况下使用额外内存并不是真正的问题,除非您为内存非常有限的系统开发某些内容(如嵌入式系统)。总之,在大多数情况下,您会想要为了算法的复杂性而折衷内存,但是您需要根据具体情况来决定。

0

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

对于这个问题一般递归或DP,权衡将是通用的递归在DP VS 运行使用内存之间。

要考虑的另一件事情并不是所有的问题都符合DP方法。 所考虑的问题,具有下列性质

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

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

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

希望它有帮助!