贪心算法(Greedy Algorithm)是一种在每一步决策中都采取当前状态下“看起来最好”的选择,从而希望最终得到全局最优解的算法思想。它不从整体最优上加以考虑,而是做出某种意义上的**局部最优选择**。
### 核心特点:
- **局部最优**:每一步都选择当前状态下的最优解。
- **不回溯**:一旦做出选择,就不会撤销或更改。
- **简单高效**:通常实现简单,时间复杂度较低。
### 举个简单例子:
假设你有若干张纸币,需要凑出 36 元,目标是用的纸币数量最少。纸币面额有:20 元、10 元、5 元、1 元。
贪心算法的做法是:
- 先选一张 20 元(剩下 16 元)
- 再选一张 10 元(剩下 6 元)
- 再选一张 5 元(剩下 1 元)
- 最后选一张 1 元(完成)
总共用了 4 张纸币,这是最优解。
### 但贪心算法并不总是能得到全局最优解:
比如,如果纸币面额是 25 元、20 元、1 元,要凑 40 元:
- 贪心算法会选一张 25 元(剩下 15 元)
- 然后选 15 张 1 元,总共用了 16 张
- 但最优解其实是选两张 20 元,只用 2 张
### 适用条件:
贪心算法只有在问题满足**贪心选择性质**和**最优子结构性质**时才能保证得到全局最优解。
- **贪心选择性质**:局部最优选择能导致全局最优。
- **最优子结构**:问题的最优解包含其子问题的最优解。
### 常见应用:
- 最小生成树(Prim、Kruskal)
- 哈夫曼编码
- 活动选择问题
- 最短路径的 Dijkstra 算法(在某些条件下)
总结一句话:
**贪心算法就是“每一步都选眼前最好的”,但“眼光是否长远”决定了它是否靠谱。**