实体信息为贪心算法相关知识:介绍了贪心算法基本思想,即逐步构造最优解,每个阶段按贪心标准做看似最优、且不可更改的决策

贪心算法的基本思想
贪心算法采用逐步构造最优解的方法。在每个阶段,都做出一个看上去最优的决策(在一定的贪心标准下),决策一旦做出,就不可再更改。做出贪心决策的依据称为贪心准则。

实体信息为贪心算法相关知识:介绍了贪心算法基本思想,即逐步构造最优解,每个阶段按贪心标准做看似最优、且不可更改的决策,做决策的依据是贪心准则 ,常用于算法设计等计算机科学领域,像活动选择问题等可通过贪心算法求解。

已整理为结构化要点:

贪心算法(Greedy Algorithm)核心思想

  1. 逐步构造:按阶段顺序构建整体最优解。
  2. 局部最优:每阶段依据贪心准则做出当前“看上去最优”的决策。
  3. 不可回退:决策一旦确定,后续阶段不再变更。
  4. 贪心准则:决策依据的衡量标准(如价值密度、最短路径等)。
    以下是一些贪心算法的具体例子:

1. 钱币找零问题

问题描述:假设存在1元、5元、10元、20元、50元、100元的纸币,要用这些纸币支付K元,求至少需要用多少张纸币 。
贪心策略:优先使用面额大的纸币,当大额纸币数量不够支付时,再使用较小面额的纸币 。
示例:若要支付187元,先尽可能用100元(1张),剩余87元;再用50元(1张),剩余37元;接着用20元(1张),剩余17元;然后用10元(1张),剩余7元;再用5元(1张),剩余2元;最后用1元(2张),总共使用了7张纸币 。

2. 活动选择问题

问题描述:在某地要举办多个活动,每个活动都有不同的起止时间,如何安排能使举办的活动数量尽量多 。
贪心策略:将所有活动按照结束时间进行排序,默认选取第一个活动,然后用当前活动的结束时间和后面活动的开始时间对比,若前者小于等于后者,则选择后面这个活动 。
示例:假设有活动A(0-2)、B(1-4)、C(3-5)、D(4-6),按结束时间排序后为A、B、D、C。先选A,A结束时间为2,B开始时间为1,2>=1,可选择B;B结束时间为4,D开始时间为4,4=4,可选择D;D结束时间为6,C开始时间为3,6>3,不选C。最终选择的活动为A、B、D 。

3. 部分背包问题(非0-1背包)

问题描述:给定n种物品,一个背包容量为c,每个物品i有价值vi和重量wi,物品可以拆分,如何选择装入的物品使得背包的总价值最大 。
贪心策略:先将物品按照单位重量价值(vi/wi)进行排序,优先装入单位重量价值高的物品,若背包有剩余容量,再装入单位重量价值次高的物品,若最后一件物品无法全部装入,按照可装入的比例装入 。
示例:有物品A(重量2,价值4),单位重量价值为2;物品B(重量3,价值9),单位重量价值为3;物品C(重量4,价值12),单位重量价值为3。背包容量为6。先按单位重量价值排序为B、C、A 。先装B,占用3重量,背包剩余3重量;再装C,只能装入一半,占用3重量。最终背包装入了完整的B和一半的C,总价值为9 + 6 = 15 。

4. 区间覆盖问题

问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(闭区间),求最少使用多少条线段可以将整个区间完全覆盖 。
贪心策略:先剔除起点和终点在所求范围之外的区间,将所有区间按起点进行排序,默认选中第一个区间,然后在挑选区间的过程中,保证新区间的起点小于当前区间的终点,新区间的终点大于当前区间的起点,重复此操作,直到当前区间的终点值大于等于预期的终点值 。
示例:所求区间为[1,10],有区间A[2,5]、B[4,7]、C[6,9]、D[8,10]。剔除不符合要求的区间后,按起点排序。先选A,A终点为5;再选B,B起点4小于5,终点7大于5,可选择;接着选C,C起点6小于7,终点9大于7,可选择;最后选D,D起点8小于9,终点10大于等于10,可选择。最终选择了A、B、C、D这4个区间覆盖了[1,10] 。

5. 霍夫曼编码

问题描述:在数据压缩中,根据字符出现的频率,构建最优的二进制前缀树,为不同字符分配编码,使得编码后的总长度最短 。
贪心策略:优先将出现频率低的字符节点合并,构建二叉树,直到形成一棵完整的霍夫曼树,然后从根节点到叶子节点路径上的0和1组合作为对应字符的编码 。
示例:假设有字符A(频率5)、B(频率9)、C(频率12)、D(频率13)、E(频率16)、F(频率45)。首先合并频率最低的A和B得到新节点AB(频率14),接着在剩余节点中合并频率低的,不断重复,最终构建出霍夫曼树,根据树为每个字符分配编码,实现数据压缩 。

6. 最小生成树问题(Prim算法或Kruskal算法)

  • Prim算法
    • 问题描述:在一个带权连通无向图中,构建一棵包含所有顶点的树,且树中所有边的权值之和最小 。
    • 贪心策略:从任意一个顶点开始,每次选择与当前生成树连接的边中权值最小的边,并将对应的顶点加入生成树,直到包含所有顶点 。
  • Kruskal算法
    • 问题描述:同样是在带权连通无向图中求最小生成树 。
    • 贪心策略:将图中所有边按权值从小到大排序,从权值最小的边开始,若这条边加入后不会形成环,则将其加入最小生成树,重复此过程,直到生成树包含所有顶点 。
      证明贪心算法对于某些问题能得到最优解,常见的方法有以下几种:

1. 反证法

  • 基本思路:假设存在一个由非贪心算法得到的最优解比贪心算法得到的解更优,然后通过推理得出矛盾,从而证明贪心算法的解就是最优解。
  • 示例(活动选择问题):在活动选择问题中,贪心算法是按照活动结束时间来选择活动。假设存在一个最优解 SSS 包含的活动数量比贪心算法得到的解 GGG 更多。设贪心算法选择的第一个活动为 a1a_1a1,在最优解 SSS 中,必然存在一个活动 b1b_1b1a1a_1a1 结束之前开始或者与 a1a_1a1 冲突(因为贪心算法选的是最早结束的活动)。我们可以用 a1a_1a1 替换 b1b_1b1,并且对后续活动进行类似调整,这样得到的解依然是可行解,且活动数量不会减少。但这与假设中 SSSGGG 活动数量更多相矛盾,所以贪心算法得到的解就是最优解。

2. 数学归纳法

  • 基本思路:先证明贪心算法在问题规模为 n=1n = 1n=1(或初始规模)时能得到最优解,然后假设在问题规模为 n=kn = kn=k 时贪心算法能得到最优解,在此基础上证明当问题规模为 n=k+1n = k + 1n=k+1 时,贪心算法依然能得到最优解 。
  • 示例(部分背包问题)
    • 基础情况:当只有一个物品时,贪心算法直接将该物品全部装入背包(如果背包容量够)或者装入部分(如果背包容量不够),显然这就是最优解 。
    • 归纳假设:假设对于 kkk 个物品,贪心算法能得到最优解。
    • 归纳步骤:当有 k+1k + 1k+1 个物品时,根据贪心策略,我们先选择单位重量价值最高的物品。若该物品能全部装入背包,装入后问题就转化为对剩下 kkk 个物品在剩余容量背包中的选择问题,由归纳假设可知后续能得到最优解;若该物品只能部分装入背包,装入部分后同样转化为对剩下 kkk 个物品在剩余容量背包中的选择问题,也能得到最优解。所以对于 k+1k + 1k+1 个物品,贪心算法也能得到最优解。

3. 最优子结构性质

  • 基本思路:证明问题具有最优子结构性质,即问题的最优解包含子问题的最优解。贪心算法每次做出局部最优选择后,剩下的子问题也是一个规模更小的同样类型的问题,且通过贪心选择得到的解和子问题的最优解组合起来就是原问题的最优解。
  • 示例(最小生成树的Kruskal算法):对于一个带权连通无向图 GGG,其最小生成树问题具有最优子结构性质。Kruskal算法每次选择权值最小且不构成环的边加入最小生成树集合 TTT 。假设我们已经选择了一些边构成了部分最小生成树,剩下的边和顶点构成的子图依然是一个带权连通无向图,要得到整个图的最小生成树,就需要在这个子图中找到最小生成树,然后和已选的边组合起来。而Kruskal算法在每一步的贪心选择(选择最小权值且不构成环的边),保证了最终得到的 TTT 就是整个图的最小生成树 。

4. 交换论证

  • 基本思路:从任意一个最优解出发,通过一系列交换操作,将其逐步转化为贪心算法得到的解,且在交换过程中解的质量不会变差,从而说明贪心算法的解是最优解。
  • 示例(霍夫曼编码):对于给定的字符频率集合,假设存在一个最优编码树 TTT 不是霍夫曼树。在霍夫曼编码中,贪心策略是每次将频率最低的两个节点合并。我们可以在最优编码树 TTT 中找到两个频率最低的节点,若它们不是兄弟节点,通过交换节点位置等操作,将它们变为兄弟节点,得到新的编码树 T′T'T 。经过分析可知,T′T'T 的编码总长度不会比 TTT 更长,不断重复这样的操作,最终可以将 TTT 转化为霍夫曼树,也就证明了霍夫曼算法得到的编码树是最优的。
    贪心算法由于其“局部最优→全局最优”的简洁高效特性,在满足“贪心选择性质 + 最优子结构” 的问题中广泛应用。典型场景分类如下:

1. 调度与资源分配

  • 活动选择问题:选最多互不冲突的活动(按结束时间排序)。
  • 任务调度:最小化平均完成时间(按处理时间升序调度)。
  • 区间覆盖:用最少的区间覆盖整个范围(如课程安排、会议室预订)。

2. 图论问题

  • 最小生成树(MST)
    • Prim算法:每次选连接已选顶点的最小边。
    • Kruskal算法:按边权升序选边(用并查集避环)。
  • 最短路径
    • Dijkstra算法(非负权图):每次选距离起点最近的未访问顶点。
  • 霍夫曼编码:构建最优前缀码(合并频率最低的两节点)。

3. 数据压缩与编码

  • 霍夫曼编码:高频字符用短码,低频用长码,压缩数据(如ZIP、PNG)。
  • 算术编码:通过概率区间划分实现高效压缩。

4. 分数背包问题

  • 部分可分割物品:按单位价值(价值/重量)降序选取,直至背包装满。

5. 网络与通信

  • 路由选择:OSPF协议用Dijkstra计算最短路径。
  • 基站覆盖:用最少的基站覆盖所有用户(类似区间覆盖)。

6. 金融与优化

  • 找零问题(硬币系统满足贪心性质时,如人民币1、5、10元):用最少硬币凑金额。
  • 股票买卖:局部峰值卖出(仅限单次交易场景)。

7. 其他经典问题

  • 拓扑排序(Kahn算法):每次选入度为0的顶点。
  • 并查集优化:按秩合并(树高最小化)。
  • 霍夫曼树:用于决策树优化(如数据分类)。

关键限制

贪心算法不适用于需全局权衡的问题(如0-1背包、旅行商问题),此时需用动态规划或回溯法。

返回图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bol5261

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

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

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

打赏作者

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

抵扣说明:

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

余额充值