贪心算法和动态规划
贪心算法和动态规划是两种常见的算法思想,通过生活化的例子对比它们的核心区别:
一、贪心算法:活在当下,只选眼前最优
特点:每一步都选择当前看起来最好的选项,不回头、不反悔。
例子:自助餐策略
假设你去吃自助餐,想吃到总价值最高的食物:
-
贪心策略:每次都拿当前最贵的食物(比如先拿龙虾,再拿牛排...)
-
优点:简单快速,无需复杂计算
-
风险:可能吃撑后错过后续更好的组合(比如拿了龙虾但错过限量甜品)
经典问题适用场景
-
找零钱问题(硬币面额合理时)
-
活动安排问题(选最多不冲突活动)
-
最小生成树(Prim/Kruskal算法)
二、动态规划:谋定后动,全局最优
特点:将大问题分解为小问题,记录中间结果,通过递推找到全局最优解。
例子:旅行路线规划
假设从北京到上海有多条路径,每段路程有不同时间成本:
-
动态规划做法:
-
记录到每个中间城市的最短时间
-
计算到下一城市时,对比所有可能路线的"历史最优+当前路段"
-
最终得到全局最优路径
-
-
优势:保证找到最佳方案
-
代价:需要存储大量中间结果
经典问题适用场景
-
背包问题(物品不可拆分)
-
最短路径问题(Floyd-Warshall算法)
-
编辑距离计算
三、关键区别对比
贪心算法 | 动态规划 | |
---|---|---|
决策方式 | 永远选择当前最优 | 综合历史数据推导最优 |
计算复杂度 | 通常低(O(n)或O(n log n)) | 通常高(O(n²)或更高) |
结果可靠性 | 可能不是全局最优 | 保证全局最优 |
存储需求 | 无需存储历史状态 | 需要存储子问题结果 |
四、如何选择算法?
-
选贪心如果:
-
问题具有"贪心选择性质"(局部最优能推导全局最优)
-
需要快速得到近似解
-
-
选动态规划如果:
-
问题有重叠子问题
-
需要绝对精确的最优解
-
能接受更高的计算成本
-
典型案例对比:
-
分数背包问题(物品可拆分):贪心最优
-
0-1背包问题(物品不可拆分):必须用动态规划
理解这两个算法的最好方式是多对比它们的典型应用场景,就像明白"快速决策"和"周密计划"在不同生活场景中的适用性一样。
贪心算法以局部最优为导向,追求高效简洁;动态规划以记忆和递推为核心,确保全局最优。