当我遇到一个具有最优子结构且没有子问题共享子子问题的问题时,我可以使用分治算法来解决它吗? 但是当子问题共享子子问题(重叠子问题)时,我可以使用动态规划来解决问题吗? 这样正确吗? 贪心算法和动态规划有何相似之处?
当我遇到具有最优子结构而没有子问题共享子子问题的问题时,我可以使用分治算法来解决它吗?是的,只要您可以找到每种子问题的最优算法。但是当子问题共享子子问题(重叠子问题)时,我可以使用动态规划来解决问题吗?这正确吗?是的。动态规划基本上是分治算法家族的一个特例,其中所有子问题都相同。贪心算法与动态规划有何相似之处?它们是不同的。动态规划提供最优解。贪心算法通常在很短的时间内给出一个好/公平的解决方案,但不能保证达到最优解。它是“类似于”,因为它通常将解决方案构建分成几个阶段,在这些阶段中,它采取局部最优选择。但是,如果阶段不是原始问题的最优子结构,则通常不会导致最佳解决方案。编辑:正如@rrenaud指出的那样,已经证明了一些贪心算法是最优的(例如Dijkstra、Kruskal、Prim等)。因此,更正确地说,贪心和动态规划之间的主要区别在于前者对解决方案空间不是穷举的,而后者是。实际上,贪心算法在该空间上是短视的,并且在解决方案构建过程中做出的每个选择都不会重新考虑。
动态规划使用自底向上的方法,保存先前的解决方案并引用它,这将使我们在所有可用解决方案中得出最优解,而贪心算法使用自顶向下的方法,因此它从局部可用解决方案中获取最优解,不会考虑之前的层级解决方案,导致解决方案不够优化。 动态规划=自底向上,最优解 贪心算法=自顶向下,不够优化,时间消耗较少。