贪婪算法是一种通过选择当前可用的最佳选项来解决问题的方法,而无需担心它会带来的未来结果。换句话说,本地最佳选择旨在产生全球最佳结果。
对于所有问题,该算法可能都不是最佳选择。在某些情况下可能会产生错误的结果。
该算法永远不会返回来扭转所做出的决定。该算法以自顶向下的方式工作。
该算法的主要优点是:
- 该算法更易于描述 。
- 该算法的性能可能优于其他算法(但并非在所有情况下都如此)。
可行的解决方案
一种可行的解决方案是为问题提供最佳解决方案的解决方案。
贪婪算法
- 首先,解决方案集(包含答案)为空。
- 在每个步骤中,将一个项目添加到解决方案集中。
- 如果解决方案集可行,则保留当前项目。
- 否则,该项目将被拒绝,不再考虑。
示例-贪婪方法
Problem: You have to make a change of an amount using the smallest possible number of coins.
Amount: $28
Available coins:
$5 coin
$2 coin
$1 coin
解:
- 创建一个空的solution-set = {} 。
- 硬币= {5,2,1}
- 总和= 0
- 当总和≠28时 ,请执行以下操作。
- 从硬币中选择一个硬币C ,使之和+ C <28 。
- 如果C + sum> 28 ,则不返回任何解。
- 否则, sum = sum + C。
- 将C添加到solution-set 。
在前5次迭代之前,解决方案集包含5个5美元的硬币。之后,我们得到1个 2美元硬币,最后得到1个1美元硬币。
贪婪算法应用
- 选择排序
- 背包问题
- 最小生成树
- 单源最短路径问题
- 作业调度问题
- Prim的最小生成树算法
- Kruskal的最小生成树算法
- Dijkstra的最小生成树算法
- 霍夫曼编码
- 福特-富克森算法