贪心算法分阶段工作。在每一个阶段,可以认为所做的决定是好的,而不考虑将来的后果。一般来说,这意味着选择的是某个局部最优。这种“眼下能够拿到的就拿”的策略是这类算法名称的来源。当算法终止时,我们希望局部最优就是全局最优。如果真是这样的话,那么算法就是正确的;否则,算法得到的是一个次最优解。如果不要求绝对的最佳答案,那么有时用简单的贪心算法生成近似答案,而不是使用一般来说产生准确答案所需要的复杂算法。
可以根据如下步骤来设计贪心算法:
1. 将优化问题转化成这样的一个问题,即像做出选择,再解决剩下的一个子问题。
2. 证明原问题总是有一个最优解是做贪心选择得到的,从而说明贪心选择的安全。
3. 说明在做出贪心选择后,剩余的子问题具有这样的一个性质。即如果将子问题的最优解和我们所作的贪心选择联合起来,可以得到原问题的一个最优解。
贪心选择性质和最优子结构性质是贪心算法关键的特点。
贪心选择性质:一个全局最优解可以通过局部最优(贪心)选择来达到。这一点是贪心算法不同于动态规划之处。在动态规划中,每一步都要做出选择,但是这些选择依赖于子问题的解。因此,解动态规划问题一般是自底向上,从小到大。在贪心算法中,我们所做的总是当前看似最佳的选择,然后再解决选择之后说出现的子问题。贪心算法所做的当前选择可能要依赖于已经做出的所有选择,当不依赖于做出的选择或子问题的解。因此,不像动态规划方法哪样自底向上地解决问题,贪心策略通常是自顶向下,一个一个做出贪心选择,不断地将给定问题实例规约为更小的问题。
贪心算法是一种很有效的方法,适用于一大类问题。最小生成树,地接斯特拉、单元最短路径算法,哈夫曼树的构造都是贪心算法的应用。
时间: 2024-11-03 05:43:13