贪心算法
一、概念问题:
- 基本思想:贪心算法首先设计某种贪心选择策略,第一步做出当前状态的最优选择;然后问题会被演化与原问题相同但是规模更小的子问题;最后用相同的贪心选择策略求解子问题。
- 基本要素:贪心选择性质和最优子结构性质。
(1)贪心选择性质:指所求问题的最优解可以通过一系列局部最优解来达到。
(2)最优子结构性质:当一个问题的最优解包含其子结构的最优解,称此问题具有最优子结构性质。 - 与动态规划的异同:
同:都是一种推导算法,都是分解成子问题来求解,都需要具有最优子结构。
异:贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。每一步的最优解一定包含上一步的最优解。动态规划全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解。
参考:链接1 - 贪心算法的基本步骤:
步骤1:从某个初始解出发
步骤2:采用迭代的过程,当可以向目标前进一步时就根据局部最优策略,得到一部分解,缩小问题规模;
步骤3:将所有解综合起来。
二、经典例题:
1. 活动选择问题
另附运行实例:
其中时间复杂度:排序+活动选择
2. 背包问题
时间复杂度:(T(n)=O(nlogn)
3. 无向连通图:prim算法构造最小生成树问题
时间复杂度:T(n)=O(n^2)
4. 无向连通图:kruskal算法构造最小生成树问题
时间复杂度:O(k^2 * log2(k) + k^2 * log2*(k)
5.有向图:Dijkstra算法计算最短路径(单源最短路径)
6.哈夫曼编码