数据结构 - 动态规划

动态编程方法类似于将问题分解为更小但更小的子问题的分而治之.但不同的是,分而治之,这些子问题并没有独立解决.相反,这些较小的子问题的结果会被记住并用于类似或重叠的子问题.

动态编程用于我们遇到问题的地方,可以分成类似的子问题,以便他们的结果可以重复使用.大多数情况下,这些算法用于优化.在解决现有子问题之前,动态算法将尝试检查先前解决的子问题的结果.结合子问题的解决方案以获得最佳解决方案.

所以我们可以说 :

  • 问题应该可以分成较小的重叠子问题.

  • 可以通过以下方式实现最佳解决方案:使用较小子问题的最佳解决方案.

  • 动态算法使用Memoization.

比较

与贪婪算法相比,本地优化得到解决,动态算法可以促进问题的整体优化.

与分而治之的算法相比,在将解决方案组合在一起以实现整体解决方案的情况下,动态算法使用较小子问题的输出,然后尝试优化更大的子问题.动态算法使用Memoization来记住已经解决的子问题的输出.

示例

使用动态编程方法可以解决以下计算机问题;

  • 斐波那契数字系列

  • 背包问题

  • 河内塔

  • Floyd-Warshall的所有最短路径

  • Dijkstra的最短路径

  • 项目调度

动态编程可以自上而下和自下而上的方式使用.当然,大多数情况下,参考之前的解决方案输出比CPU周期重新计算更便宜.