Algorithm 求和为特定值的所有子集。递归还是DP?

Algorithm 求和为特定值的所有子集。递归还是DP?,algorithm,recursion,dynamic-programming,memoization,Algorithm,Recursion,Dynamic Programming,Memoization,求和为特定值的所有子集 给定一组数字:{1,3,9,12},目标值=12。查找与目标值求和的不同子集 答复:[3,9],[12] 解决这类问题显然有两种方法。递归或DP问题:如何权衡这两种方法? 我的解决方案是:DP更难,但它消耗的内存更少。在递归中,您必须递归调用函数数次,这就引入了函数过头。但它“相当”容易,但会消耗更多内存 你们怎么看?一般来说,没有任何缓存的递归可以为一个问题提供指数复杂度的解决方案,这个问题可以用多项式或线性复杂度来解决。这是因为你多次计算相同的部分问题。使用的递归或

求和为特定值的所有子集

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

答复:[3,9],[12]

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

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


你们怎么看?

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

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


总而言之,在大多数情况下,您可能希望在算法复杂度方面权衡内存,但您需要根据具体情况来决定。一般来说,没有任何缓存的递归可能会导致问题的指数复杂度解决方案,而问题可以用多项式或线性复杂度来解决。这是因为你多次计算相同的部分问题。使用的递归或迭代解决方案可以通过使用更多内存来降低复杂性

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


总而言之,在大多数情况下,您可能希望在算法复杂度方面权衡内存,但您需要根据具体情况来决定。我想DP可以通过递归或基于该方法(自顶向下或自下而上)的迭代来实现。 通用递归解决方案和DP之间的主要区别在于是否使用额外内存,这将是算法运行时的权衡。基本上,通过存储和引用它,您可以避免额外的计算

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

另一个要考虑的问题不是所有的问题都适用于DP方法。 正在考虑的问题具有以下特性

  • “最优子结构”-给定问题的最优解可通过使用其子问题的最优解获得
  • “重叠子问题”-相同子问题的解决方案被多次使用
  • 上述两个属性是DP实现所必需的。否则DP不会给您任何优化

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


    希望有帮助

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

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

    另一个要考虑的问题不是所有的问题都适用于DP方法。 正在考虑的问题具有以下特性

  • “最优子结构”-给定问题的最优解可通过使用其子问题的最优解获得
  • “重叠子问题”-相同子问题的解决方案被多次使用
  • 上述两个属性是DP实现所必需的。否则DP不会给您任何优化

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

    希望有帮助

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