贪婪算法是否也可能是动态编程算法?

问题描述 投票:1回答:3

greedy算法是否也可能是dynamic programming算法?

我参加了一个Analysis of Algorithms课程,但我仍然不确定这两个概念。

我知道贪婪的方法使用当前的最优解来找到全局最优解,DP算法重用重叠的子结果。

我相信答案是“是”,但我找不到一个贪婪和DP算法的好例子。

有人能举个例子吗?

如果上述问题的答案是“否”,那么有人可以向我解释原因吗?

algorithm dynamic-programming greedy
3个回答
1
投票

从查看Bellman方程:

如果在最小化中我们可以将f部分(当前时期)与J部分(从先前时期最佳)分开,那么这恰好与贪婪方法相对应。一个简单的例子是当优化函数是每个时期的成本之和时,

J(u1,u2,...)= sum(f_i(u_i))


2
投票

这是我的理解

贪心算法和动态算法是两回事。贪婪的算法总是做出那个时刻似乎最好的选择。无论接下来会发生什么,它都会在新选项弹出后立即做出选择。动态算法结合了子程序的解决方案,以获得最终的解决方案。它根据子程序的结果做出决定,它通常在影响最终解决方案的变量时起作用。所以,这些是两种思维方式。

动态算法总是适用于贪心算法可以解决的问题,但动态算法的时间成本和空间成本远高于贪心算法。贪心算法大多无法解决DP问题。

所以答案是否定的


1
投票

在优化算法中,贪婪方法和动态编程方法基本上是对立的。贪婪的方法是选择局部最优选项,而动态编程的整个目的是有效地评估整个选项范围。

但这并不意味着您不能拥有利用这两种策略的算法。例如,A *路径寻找算法就是这样做的,并且既是贪婪算法又是动态编程算法。它使用贪婪方法来优化最佳情况,并使用动态编程方法来优化最坏情况。

见:https://en.wikipedia.org/wiki/A*_search_algorithm

© www.soinside.com 2019 - 2024. All rights reserved.