动态编程和贪婪方法有什么区别?

时间:2013-05-22 11:11:07

标签: algorithm dynamic graph greedy

动态编程和贪婪方法在使用方面的主要区别是什么?

据我所知,贪心方法有时会提供最佳解决方案;在其他情况下,动态编程方法提供了最佳解决方案。

为了使用一种方法(或另一种方法)获得最佳解决方案,是否必须满足任何特定条件?

6 个答案:

答案 0 :(得分:64)

基于维基百科的文章。

贪婪的方法

贪婪算法是一种遵循问题解决启发式算法的算法 每个阶段的局部最优选择,希望找到全局最优。在 许多问题,贪婪策略通常不能产生最优解,但是贪婪的启发式算法可能会产生局部最优解,在合理的时间内逼近全局最优解。

我们可以做出目前最好的选择,然后解决后来出现的子问题。 贪婪算法所做出的选择可能取决于目前为止做出的选择,但不取决于未来的选择或子问题的所有解决方案 。它迭代地使一个又一个贪婪的选择,将每个给定的问题减少为一个较小的问题。

动态编程

动态编程背后的想法非常简单。一般来说,为了解决给定的问题,我们需要解决问题的不同部分(子问题), 然后结合子问题的解决方案来达到整体解决方案 。通常在使用更天真的方法时,会产生并解决许多子问题。动态编程方法寻求解决每个子问题 ,从而减少计算次数:一旦计算出给定子问题的解,就存储它或“备忘录” -ized“:下次需要相同的解决方案时,只需查阅即可。当重复子问题的数量随着输入的大小呈指数增长时,这种方法特别有用。

差分

贪婪的选择属性

我们可以做出目前最好的选择,然后解决后来出现的子问题。贪婪算法做出的选择可能取决于目前为止做出的选择,而不取决于未来的选择或子问题的所有解决方案。它迭代地使一个接一个的贪婪选择,将每个给定的问题减少为一个较小的问题。换句话说,贪婪算法从不重新考虑其选择。

这是与动态编程的主要区别,动态编程是详尽的,并保证找到解决方案。在每个阶段之后,动态编程基于前一阶段做出的所有决策做出决策,并可能重新考虑前一阶段的算法解决方案。

例如,假设您必须在高峰时段内在特定城市尽可能快地从A点到达B点。动态编程算法将查看整个流量报告,查看您可能采取的所有可能的道路组合,然后才会告诉您哪种方式最快。当然,您可能需要等待一段时间,直到算法结束,然后才能开始驾驶。您将采用的路径是最快的路径(假设外部环境没有任何变化)。

另一方面,贪婪的算法将立即开始你的驾驶,并将选择在每个交叉路口看起来最快的道路。你可以想象,这种策略可能不会带来最快的到达时间,因为你可能会走一些“简单”的街道,然后发现自己无可救药地陷入交通堵塞。

其他一些细节......

在数学优化中,贪婪算法解决了具有matroids属性的组合问题。

动态编程适用于表现出重叠子问题和最佳子结构的属性的问题

答案 1 :(得分:14)

我想引用一段描述贪婪算法和动态编程算法之间的主要区别,这一段落在Cormen,第15.3章的书Introduction to Algorithms (3rd edition)中。 ,第381页:

  

贪婪算法动态编程之间的一个主要区别是,贪婪算法不是首先找到子问题的最佳解决方案然后做出明智的选择,而是首先制作贪婪的选择,当时看起来最好的选择,然后解决产生的子问题,而不必费心解决所有可能相关的较小子问题。

答案 2 :(得分:1)

贪婪方法和动态编程之间的区别如下:

  1. 贪心方法永远不会重新考虑其选择,而动态编程可能会考虑先前的状态。

  2. 贪婪算法效率较低,而动态编程效率较高。

  3. 贪心算法对子问题有局部选择,而动态规划将解决所有子问题,然后选择一个导致最优解的子问题。

  4. 贪心算法一次做出决定,而动态编程则在每个阶段做出决定。

答案 3 :(得分:0)

简单来说,我们可以说let rows = Array.prototype.slice.call(document.querySelectorAll('table tr')); let textDate = '2013-03-21'; rows.map((row) => { let cells = Array.prototype.slice.call(row.querySelectorAll('td')); for (let i = 0, length = cells.length; i < length; i++) { if (cells[i].textContent === textDate) { let cb = row.querySelectorAll('input[type=checkbox]'); cb[0].checked = true; return; } } }); (在网络上发送问题时有问题)可以先查看花费最短时间然后开始旅程的路径,

另一方面Dynamic Programming当场Greedy algorithm而不考虑下一步,下一步又改变决定等等......

optimal decision Notes:是可靠的,而贪婪算法总是不可靠。

答案 4 :(得分:0)

参考Biswajit Roy: 动态编程首先计划然后进行。 和 贪婪算法使用贪婪选择,首先执行Go,然后连续进行计划。

答案 5 :(得分:-1)

贪婪方法与动态规划的主要区别在于贪婪方法只能产生一个最优决策序列,而在动态规划中可以生成一个以上最优决策序列。