2026-07-10 04:07:02
贪心算法是一种在每一步选择中采取当前状态下最优决策,期望通过局部最优解的累积达到全局最优解的算法策略。
贪心算法与动态规划的区别贪心算法:以“当下最优”为核心,每一步选择局部最优解,决策不可撤销,不依赖未来信息,具有“短视”特征。例如找零钱问题中,每次选择最大面值硬币,不考虑后续影响。
动态规划:通过拆解问题为子问题,存储子问题解以避免重复计算,综合所有可能路径选择全局最优解。例如棋手布局时,需考虑每一步对全局的影响。
贪心算法:无回溯机制,决策一旦做出不可更改。
动态规划:通过保存子问题解,允许回溯调整决策路径。
贪心算法:因无回溯,复杂度通常较低。
动态规划:需存储子问题解,复杂度较高。
判断问题是否适用贪心算法需同时满足以下两个性质:
局部最优选择能导向全局最优解。例如标准货币系统(如1、5、10、20元)中,每次选择最大面值硬币可保证总硬币数最少;但非标准系统(如1、5、8元凑10元)中,贪心选择(8+1+1)可能不如非贪心选择(5+5)优。
问题的最优解包含子问题的最优解。例如最小生成树问题中,当前选择的边与剩余子图的最小生成树组合可构成全局最优解。
霍夫曼编码:通过合并频率最低的节点构建最优二叉树,实现数据压缩。
最小生成树算法:
Prim算法:每次选择连接已选顶点与未选顶点的最小权边。
Kruskal算法:每次选择全局最小权边,避免形成环。
活动选择问题:每次选择最早结束的活动,最大化互不冲突的活动数量。
Dijkstra算法:每次选择距离源点最近的未访问顶点,更新邻居距离,求解单源最短路径。
局部最优陷阱:误认为局部最优必然导致全局最优,忽视严格证明。例如非标准货币系统找零问题中,贪心策略可能失效。
问题模型简化过度:忽略关键约束条件,导致算法失效。例如资源调度中仅按任务时长排序,可能忽略优先级或截止日期。
数据敏感性不足:贪心算法对数据特性敏感,例如特定图结构中Dijkstra算法可能因负权边失效。
与动态规划混淆:在贪心选择性质不成立时强行应用贪心算法,导致错误结果。例如背包问题中,0-1背包需动态规划,而分数背包可用贪心算法。
贪心算法以高效简洁著称,但仅适用于满足贪心选择性质和最优子结构性质的特定问题。设计时需严格验证其正确性,避免陷入局部最优陷阱或过度简化问题模型。