【问题标题】:algorithm to save states for dynamic programming为动态规划保存状态的算法
【发布时间】:2012-10-02 07:06:19
【问题描述】:

这是一个关于使用动态编程在问题中保存状态的问题。

  • DP 的每个问题都会保存结果并进一步使用它们来减少计算量。假设我们计算函数值f(x,y)=290 并将其保存在二维数组$save 中,即$save[x][y]=290。这可以在 'f' 仅依赖于少量变量时完成(例如,在上面的示例中只有 2 个变量 x 和 y)。但是 'f' 依赖于 10 或 15 个变量时可以做什么。制作 10 或 15 维的数组不会节省内存。

  • 另一种解决方案可能是我们连接变量的值(假设它们是唯一的)并将它们存储在关联数组中,使用通过连接作为键。但是,连接是一项耗时的操作因此,我们需要在内存和时间之间进行权衡

如果状态所依赖的变量数量较多,有没有办法存储状态?我认为可能有某种方法可以使用 OOPS 或指针,但我不太能够构建任何东西。有什么建议么?每个想法都受到赞赏,但考虑到 'C''PHP' 的解决方案是首选。我知道“C”不处理关联数组,但我只想要一种算法/方法来保存状态。

【问题讨论】:

  • 呃,使用map:Tuple->Value?但是,如果您要计算所有可能的输入 (x_1,x_2,..x_k) 直到某个限制 - 多维数组可能是最好的解决方案(访问速度更快,然后是 map,无论如何您都要填充地图如果您计算所有/大多数值)。
  • 您应该重新格式化这个问题以使其更具可读性。没有段落,一堆粗体字真的很难读。
  • @amit 我已经尝试使用 k=10 的 10 维数组来执行此操作,但它需要非常高的内存。您能提出更好的解决方案吗?
  • @verdesmarald 我已经做到了。谢谢。
  • 使用 vars 的 hash 作为 key,将 function 和 vars 存储在 1:n 表中?

标签: php c algorithm dynamic-programming


【解决方案1】:
  1. 在稀疏数据中保存状态通常使用map (Associative Array) 接口完成。尽管 C 没有内置它 - 互联网上到处都是提供此功能的库。

  2. 如果您要计算大多数/所有 (x1,...,xk) 值 - 不鼓励使用 map - 它会更慢并且不会节省内存(另一个实际上,这些情况下的方法)。如果是这种情况 - 多维数组可能是最好的解决方案。

  3. 很多时候,在 DP 中,您不需要 all 到目前为止信息的数组,只需要先前计算的“线”,并覆盖数组。有效 - 对于许多需要 k*N 表的 DP 问题,您实际上只需要大小为 2*N 的表,并迭代地覆盖相同的行。同样的原则适用于我认为的任何维度 - 如果您需要的只是前一行的数据,而不是所有数据。

【讨论】:

  • 你的意思是,保存在多维数组中并迭代覆盖?
  • @user1708762:完全正确 - 这是 DP 算法中的常见优化,它始终只需要最后一行而不是到目前为止计算的所有行。
  • 谢谢。顺便说一句,这种优化只适用于自下而上的方法还是也适用于自上而下的方法?
  • @user1708762:我从未在自上而下的方法中看到它,我想不出它会在自上而下的情况下工作。但是 - 它非常适合许多自上而下的算法,例如 LCS
  • 感谢您的回答。你能回答我提出的另一个问题吗-> stackoverflow.com/questions/12655593/…
猜你喜欢
  • 2012-03-26
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
相关资源
最近更新 更多