greedy
算法是否也可能是dynamic programming
算法?
我参加了一个Analysis of Algorithms
课程,但我仍然不确定这两个概念。
我知道贪婪的方法使用当前的最优解来找到全局最优解,DP算法重用重叠的子结果。
我相信答案是“是”,但我找不到一个贪婪和DP算法的好例子。
有人能举个例子吗?
如果上述问题的答案是“否”,那么有人可以向我解释原因吗?
从查看Bellman方程:
如果在最小化中我们可以将f部分(当前时期)与J部分(从先前时期最佳)分开,那么这恰好与贪婪方法相对应。一个简单的例子是当优化函数是每个时期的成本之和时,
J(u1,u2,...)= sum(f_i(u_i))
。
这是我的理解
贪心算法和动态算法是两回事。贪婪的算法总是做出那个时刻似乎最好的选择。无论接下来会发生什么,它都会在新选项弹出后立即做出选择。动态算法结合了子程序的解决方案,以获得最终的解决方案。它根据子程序的结果做出决定,它通常在影响最终解决方案的变量时起作用。所以,这些是两种思维方式。
动态算法总是适用于贪心算法可以解决的问题,但动态算法的时间成本和空间成本远高于贪心算法。贪心算法大多无法解决DP问题。
所以答案是否定的
在优化算法中,贪婪方法和动态编程方法基本上是对立的。贪婪的方法是选择局部最优选项,而动态编程的整个目的是有效地评估整个选项范围。
但这并不意味着您不能拥有利用这两种策略的算法。例如,A *路径寻找算法就是这样做的,并且既是贪婪算法又是动态编程算法。它使用贪婪方法来优化最佳情况,并使用动态编程方法来优化最坏情况。