📜  贪婪算法(一般结构和应用)

📅  最后修改于: 2021-04-26 17:40:18             🧑  作者: Mango

贪婪算法是分步进行的,始终选择可以立即带来收益/收益的步骤。它选择“局部最佳解决方案”,而无需考虑未来的后果。贪婪算法可能不会总能得出最佳的全局解,因为它不会考虑整个数据。贪婪方法做出的选择不考虑未来的数据和选择。

所有贪婪算法都遵循基本结构:

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问题的情况下寻找接近优化的方法。

缺点

  • 局部最优解可能并不总是全局最优的。

标准贪婪算法:

  1. 活动选择问题
  2. 埃及分数
  3. 作业排序问题
  4. 作业排序问题(使用不交集)
  5. 霍夫曼编码
  6. 供水问题
  7. 警察抓小偷
  8. 托架平衡的最小掉期
  9. 试管架问题
  10. 克鲁斯卡尔的最小生成树
  11. 普里姆的最小生成树
  12. Boruvka的最小生成树
  13. MST的反向删除算法
  14. Dijkastra最短路径算法