第四章作业
一、贪心算法分析“选点问题”
首先明确选点问题的经典描述:给定数轴上的n个闭区间[a_i, b_i],选择最少的点,使得每个区间至少包含一个选点。
- 贪心策略
核心策略:按区间的右端点从小到大排序,依次选择每个区间的右端点作为选点,若当前区间已包含已选点则跳过,否则选择当前区间的右端点。
具体步骤:
1. 将所有区间按右端点b_i升序排列;
2. 初始化第一个选点为第一个区间的右端点b_1;
3. 遍历后续每个区间,若当前区间的左端点a_i > 已选的最后一个点,则选择该区间的右端点作为新的选点,更新最后一个选点。
- 贪心选择性质证明
贪心选择性质是指:问题的全局最优解可以通过一系列局部最优的贪心选择得到。
证明:
设S是该问题的一个最优解,第一个选中的点为x。将区间按右端点升序排列后,第一个区间为I_1=[a_1, b_1]。
- 若x = b_1,则最优解的第一个选择与贪心选择一致;
- 若x > b_1,由于I_1的右端点是b_1,x不在I_1内(与S是可行解矛盾);
- 若x < b_1,将S中的x替换为b_1,新的点集S'仍然是可行解(因为b_1在I_1内,且对于后续包含x的区间,必然包含b_1,因为区间按右端点排序,后续区间的左端点≤b_1≤后续区间的右端点),且S'的选点数量与S相同,即S'也是最优解。
因此,选择第一个区间的右端点作为第一个选点是贪心选择,且剩余子问题(选择覆盖剩余区间的最少点)的最优解与该贪心选择结合,得到原问题的最优解,满足贪心选择性质。
- 时间复杂度分析
- 排序阶段:对n个区间按右端点排序,时间复杂度为O(n\log n)(基于比较的排序算法,如快速排序、归并排序);
- 遍历阶段:遍历n个区间,每个区间仅需一次比较和常数操作,时间复杂度为O(n)。
综上,算法的总时间复杂度为O(n\log n)(排序为主要时间开销)。
二、对贪心算法的理解
贪心算法是一种在每一步选择中都采取当前局部最优决策的算法策略,期望通过一系列局部最优选择得到全局最优解。
1. 核心特征
- 无后效性:每一步的贪心选择仅依赖当前状态,不考虑后续步骤的影响;
- 贪心选择性质:局部最优选择能导致全局最优解(这是贪心算法可行的关键,需严格证明);
- 最优子结构:问题的最优解包含其子问题的最优解。
2. 适用场景
仅适用于满足贪心选择性质和最优子结构的问题,如活动安排、哈夫曼编码、单源最短路径(Dijkstra)、最小生成树(Prim/Kruskal)等。若问题不满足贪心选择性质,贪心算法会得到次优解(如0-1背包问题用贪心按单位价值选,无法得到最优解)。
3. 与动态规划的区别 - 贪心:每一步做不可逆的局部最优选择,无回溯;
- 动态规划:记录子问题的最优解,通过子问题的解推导原问题解,需考虑所有可能的选择。
浙公网安备 33010602011771号