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

📅  最后修改于: 2021-10-26 02:37:53             🧑  作者: Mango

Greedy Algorithms 是按部就班地工作,并且总是选择提供直接利润/收益的步骤。它选择“局部最优解”,而不考虑未来的后果。贪心算法可能并不总是导致最优的全局解决方案,因为它不考虑整个数据。贪心法所做的选择没有考虑未来的数据和选择。在某些情况下,做出当时看起来正确的决定会提供最佳解决方案(贪婪),但在其他情况下则不然。贪婪技术最适合观察眼前的情况。

所有贪心算法都遵循一个基本结构:

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. 为 NP-Hard 问题(如 TSP)寻找接近最优解。

贪婪方法的优缺点
好处

  • 贪婪的方法很容易实现。
  • 通常具有较低的时间复杂度。
  • 贪心算法可用于优化目的或在 NP Hard 问题的情况下寻找接近优化。

缺点

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

标准贪心算法:

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。