分而治之、动态编程和贪婪算法



当我有一个最优子结构的问题,并且没有子问题共享子问题时,我可以使用分治算法来解决它?

但是,当子问题共享子问题(重叠子问题)时,我可以使用动态规划来解决问题吗?

这是正确的吗?

贪婪算法与动态编程有什么相似之处?

当我遇到最优问题时子结构和无子问题共享子问题,那么我可以使用除法和征服算法来解决它?

是的,只要你能为每种子问题找到一个最优算法。

但是当子问题共享子问题(重叠子问题),那么我可以使用dynamic编程来解决问题?

这是正确的吗?

是的。动态规划基本上是Divide&征服算法,其中所有子问题都是相同的。

贪婪算法是如何相似的到动态编程?

它们是不同的
动态编程为您提供最佳解决方案
Greedy算法通常在很短的时间内给出一个好的/公平的解决方案,但它不能保证达到最优。

它是类似的,让我们说,因为它通常将解决方案构建分为几个阶段,在这些阶段中,它选择了局部最优的选项。但是,如果阶段不是原始问题的最优子结构,那么通常不会得到最佳解。

编辑:

正如@rrenaud所指出的,有一些贪婪算法已被证明是最优的(例如Dijkstra、Kruskal、Prim等)。
因此,更准确地说,贪婪编程和动态编程之间的主要区别在于,前者在解的空间上不是穷举的,而后者是穷举的。
事实上,贪婪算法在这个空间上是短视的,并且在解决方案构建过程中做出的每一个选择都不会被重新考虑。

动态程序使用自下而上的方法,保存上一个解决方案并引用它,这将允许我们在所有可用的解决方案中做出最优解,而贪婪方法使用自上而下的方法,因此它从本地可用的解中获取最优解,不会采用导致优化程度较低的前一级解决方案。动态=自下而上的最佳解决方案贪婪=自上而下、不太优化、耗时更少的

最新更新