数据结构-贪心策略(贪心算法)

本文详细介绍了贪心算法的核心思想,包括局部最优决策、贪心选择性质,以及如何判断问题是否适合贪心算法。此外,还列举了霍夫曼编码、Prim算法、Kruskal算法、Dijkstra算法、活动安排和贪婪币找零等典型应用案例。
摘要由CSDN通过智能技术生成
  • 贪心算法

    • 1.贪心算法的核心思想

      • 局部最优思想:在每一步决策时做出对当前看起来最优的解,并且期望这些局部最优的选择能成全全局最优解.
      • 全局最优构造:对于给定的问题,其全局最优解可以通过将问题分解为一系列子问题,然后在每个子问题上独立做出贪心选择来构建。这种全局最优解可以通过局部最优解的简单组合(如累加、合并等)得到,而不需要回溯或重新考虑之前的选择。
      • 贪心选择性质:问题是否适合采用贪心算法,关键在于它是否具有贪心选择性质。一个具有贪心选择性质的问题意味着,无论之前的决策如何,只要按照贪心策略进行选择,最终一定能得到全局最优解。换句话说,问题的最优解可以被分解为各个阶段的最优决策之和,且这些局部最优决策之间没有冲突或依赖关系。
      • 局限性:贪心算法并非适用于所有问题。有些问题的全局最优解不能通过简单的局部最优选择直接构建,可能存在状态间的隐含依赖或冲突。
    • 2.贪心选择的性质(判断一个问题是否适合用贪心算法)

      • 最优子结构:问题的最优解可以被分解为多个子问题的最优解。
      • 贪心选择有效性:对于任何一步的决策,选择当前状态下最优的选项(局部最优解)不会影响后续步骤中获得全局最优解的可能性。这意味着,无论之前做了什么选择,后续的决策都可以独立地、无冲突地做出贪心选择,且这些选择共同构成的全局解仍为最优。
      • 不可逆性和无后效性:一旦做出了某个贪心选择,之后的决策不再受其影响,或者说之前的选择对未来决策没有副作用。这种特性使得在贪心算法中,每一步决策都是独立的,只需考虑当前状态下的最优选择即可。
      • 可行性约束:贪心选择必须在满足问题的可行性约束(如资源限制、时间窗口、物理规律等)的前提下进行。在做出局部最优选择时,必须确保所选方案符合问题设定的所有限制条件,否则即使该选择在贪心准则下最优,也无法纳入最终的全局解。
      • 贪心准则的一致性:贪心准则在整个决策过程中应保持一致,即每一步决策都使用相同的贪心标准进行评估。
    • 3.构建贪心算法

      • 确认问题的贪心选择性质:首先,要确保所解决的问题具备贪心选择性质,即满足最优子结构、贪心选择有效性、不可逆性或无后效性、可行性约束以及贪心准则的一致性。如果问题不具备这些性质,则贪心算法可能无法找到全局最优解,此时需要考虑其他算法(如动态规划、回溯等)。
      • 定义问题的数学模型:明确问题的输入、输出、约束条件和目标函数。将问题表述为数学形式.
      • 设计贪心准则:确定用于指导每一步决策的贪心准则。贪心准则应反映问题的目标,即在当前状态下,何种选择被认为是最优的。常见的贪心准则包括最大化收益、最小化成本、最短路径、最大满意度等。
      • 构建贪心选择函数:基于贪心准则,编写贪心选择函数。该函数负责在当前状态下,根据贪心准则从所有可行选项中选择一个最优解。贪心选择函数通常涉及排序、比较、选择等操作,确保所选选项在当前状态下满足贪心准则。
      • 实现贪心算法框架:根据问题的具体情况,设计贪心算法的基本框架。这通常包括初始化、贪心选择、更新状态等步骤。
    • 4.典型的贪心算法

      • 霍夫曼编码
        • 应用场景:数据压缩。霍夫曼编码是一种用于无损数据压缩的二叉树编码方法,特别适用于文本数据的压缩。
        • 贪心选择:构建霍夫曼树的过程中,每次选择频率最低的两个节点进行合并,生成一个新的节点,其频率为两个子节点频率之和。这个过程重复进行,直到只剩下一个节点,即构建出霍夫曼树。贪心选择体现在每次都选择当前频率最小的节点进行合并,以期望生成的编码尽可能短。
      • prim算法/ Kruskal 算法
        • 应用场景:最小生成树问题。在给定的带权无向图中,寻找一棵连接所有顶点且边权之和最小的树。
        • 贪心选择:
          1. Prim’s 算法:从任一顶点开始,每次选择与已选顶点集合相连的、权值最小的边,将其对应的未选顶点加入集合。贪心选择体现在每次只添加一条与已形成子树相连的、权值最小的边。
          2. Kruskal’s 算法:按照边的权值从小到大排序,每次选择当前未构成环的最小权值边加入结果集。贪心选择体现在每次都选择权值最小且不引入环的边。
      • Dijkstra算法
        • 应用场景:单源最短路径问题。在有向图或无向图中,寻找从指定起点到所有其他顶点的最短路径.
        • 贪心选择:维护一个优先队列(如堆),初始时包含起点,队列中的元素按已知的最短距离进行排序。每次从队列中取出当前距离最小的顶点,更新与其相邻顶点的距离(如果新路径更短)。贪心选择体现在每次从待处理顶点中选择已知最短路径距离最小的顶点进行扩展。
      • 活动安排问题
        • 应用场景:资源调度。给定一系列有开始时间和结束时间的活动,选择其中最多数量的互不冲突的活动进行安排。
        • 贪心选择:从开始时间最早的活动开始,依次选择结束时间最早的活动,只要其与已选活动不发生时间冲突。贪心选择体现在每次总是优先选择结束时间最早的活动,以期留出更多时间容纳后续活动。
      • 贪婪币找零算法
        • 应用场景:找零问题。
        • 贪心选择:按照面额从大到小对硬币排序。从最大面额的硬币开始,尽可能多地使用当前面额的硬币,直到剩余金额小于当前面额。然后转向下一个较小面额的硬币,重复该过程,直到剩余金额为零。贪心选择体现在每次总是优先使用最大面额的硬币,以尽快减少剩余金额。
  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Iron_Sp-man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值