贪婪算法是分步进行的,始终选择可以立即带来收益/收益的步骤。它选择“局部最佳解决方案”,而无需考虑未来的后果。贪婪算法可能不会总能得出最佳的全局解,因为它不会考虑整个数据。贪婪方法做出的选择不考虑未来的数据和选择。
所有贪婪算法都遵循基本结构:
getOptimal(Item, arr[], int n)
1) Initialize empty result : result = {}
2) While (All items are not considered)
// We make a greedy choice to select
// an item.
i = SelectAnItem()
// If i is feasible, add i to the
// result
if (feasible(i))
result = result U i
3) return result
贪婪方法的特征
1.有一个有序的资源清单(利润,成本,价值等)
2.取最大的所有资源(最大利润,最大价值等)。
3.例如,在小背包问题中,最大值/重量首先根据可用容量确定。
贪婪算法的应用
1.寻找最佳解决方案(活动选择,小背包,作业排序,霍夫曼编码)。
2.为诸如TSP之类的NP-Hard问题寻找接近最佳的解决方案。
贪婪方法的优缺点
好处
- 贪婪的方法很容易实现。
- 通常具有较少的时间复杂度。
- 贪婪算法可用于优化目的或在NP Hard问题的情况下寻找接近优化的方法。
缺点
- 局部最优解可能并不总是全局最优的。
标准贪婪算法:
- 活动选择问题
- 埃及分数
- 作业排序问题
- 作业排序问题(使用不交集)
- 霍夫曼编码
- 供水问题
- 警察抓小偷
- 托架平衡的最小掉期
- 试管架问题
- 克鲁斯卡尔的最小生成树
- 普里姆的最小生成树
- Boruvka的最小生成树
- MST的反向删除算法
- Dijkastra最短路径算法