第四章作业
一、选点问题分析(经典区间选点问题)
- 问题定义
给定若干个闭区间[a_i, b_i],要求选择最少数量的点,使得每个区间至少包含一个选点。 - 贪心策略
核心策略:按区间的右端点从小到大排序,依次遍历每个区间;若当前区间未被已选点覆盖,则选择该区间的右端点作为新的选点。
具体步骤:
-
将所有区间按右端点升序排序;
-
初始化第一个选点为第一个区间的右端点;
-
遍历后续每个区间:
若当前区间的左端点 > 已选的最后一个点 → 该区间未被覆盖,选择其右端点作为新选点;
否则 → 该区间已被覆盖,跳过。 -
贪心选择性质证明
贪心选择性质:局部最优选择(选当前区间右端点)可导致全局最优解。
证明过程:
假设存在一个最优解 S,其选点数量为 k;按上述贪心策略得到的解为 T,选点数量为 m。需证明 m = k(即贪心解是最优解)。
第一步:将最优解 S 的选点按从小到大排序,记为 s_1, s_2, ..., s_k;贪心解 T 的选点记为 t_1, t_2, ..., t_m。
第二步:对比第一个选点 t_1(第一个区间的右端点)和 s_1:
由于所有区间已按右端点排序,第一个区间的右端点 t_1 是所有区间中最小的右端点;
最优解 S 中,第一个选点 s_1 必须 ≤ t_1(否则第一个区间无法被覆盖);
若 s_1 < t_1 → 可将 s_1 替换为 t_1,此时 t_1 能覆盖更多后续区间(因为 t_1 更大),替换后的解仍为最优解(选点数量不变)。
第三步:归纳推广到后续选点:
假设前 i 个贪心选点 t_1...t_i 与替换后的最优解选点一致,对于第 i+1 个区间,贪心选点 t_{i+1} 是未被覆盖区间的最小右端点,同理可替换最优解的 s_{i+1} 为 t_{i+1},且选点数量不变。
结论:贪心解的选点数量 m 不大于最优解的 k,且贪心解是可行解(覆盖所有区间),因此 m = k,即贪心策略得到全局最优解。
- 时间复杂度分析
排序阶段:若有n个区间,排序的时间复杂度为O(n log n)(基于比较的排序,如快速排序/归并排序);
遍历阶段:遍历所有区间仅需O(n)时间;
总时间复杂度:O(n log n)(排序为主要耗时操作)。
二、对贪心算法的理解
贪心算法是一种以局部最优追求全局最优的算法设计范式,核心是每一步都做出当前看起来最优的选择,且不回溯。
-
核心特征
贪心选择性质:局部最优选择能导致全局最优解(这是贪心算法可行的关键,需严格证明);
最优子结构:问题的最优解包含其子问题的最优解(与动态规划共享该性质,但贪心无后效性,无需记录所有子问题解)。 -
贪心算法的应用场景
区间类问题(区间选点、区间调度、活动选择);
哈夫曼编码(按字符频率选最优二叉树);
最小生成树(Prim算法、Kruskal算法);
最短路径(Dijkstra算法,无负权边);
找零问题(面值满足贪心性质,如人民币面值)。 -
设计贪心算法的关键
确定贪心策略:需结合问题特征(如区间选点的“右端点排序”);
证明贪心选择性质:这是贪心算法正确性的核心(若无法证明,贪心可能得到次优解);
验证最优子结构:确保子问题的最优解能组合成原问题的最优解。 -
局限性
贪心算法并非适用于所有优化问题:若问题不满足“贪心选择性质”,局部最优无法推导出全局最优。例如:
找零问题:若面值为[1, 3, 4],找零6元时,贪心选4+1+1(3枚),但最优解是3+3(2枚);
背包问题:0-1背包无法用贪心(物品不可分割),而分数背包可贪心(按单位价值排序)。
浙公网安备 33010602011771号