第四章作业

一、选点问题分析(经典区间选点问题)

  1. 问题定义
    给定若干个闭区间 [a_i, b_i],要求选择最少数量的点,使得每个区间至少包含一个选点。
  2. 贪心策略
    核心策略:按区间的右端点从小到大排序,依次遍历每个区间;若当前区间未被已选点覆盖,则选择该区间的右端点作为新的选点

具体步骤:

  1. 将所有区间按右端点升序排序;

  2. 初始化第一个选点为第一个区间的右端点;

  3. 遍历后续每个区间:
    若当前区间的左端点 > 已选的最后一个点 → 该区间未被覆盖,选择其右端点作为新选点;
    否则 → 该区间已被覆盖,跳过。

  4. 贪心选择性质证明
    贪心选择性质:局部最优选择(选当前区间右端点)可导致全局最优解

证明过程:
假设存在一个最优解 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,即贪心策略得到全局最优解。

  1. 时间复杂度分析
    排序阶段:若有 n 个区间,排序的时间复杂度为 O(n log n)(基于比较的排序,如快速排序/归并排序);
    遍历阶段:遍历所有区间仅需 O(n) 时间;
    总时间复杂度:O(n log n)(排序为主要耗时操作)。

二、对贪心算法的理解
贪心算法是一种以局部最优追求全局最优的算法设计范式,核心是每一步都做出当前看起来最优的选择,且不回溯。

  1. 核心特征
    贪心选择性质:局部最优选择能导致全局最优解(这是贪心算法可行的关键,需严格证明);
    最优子结构:问题的最优解包含其子问题的最优解(与动态规划共享该性质,但贪心无后效性,无需记录所有子问题解)。

  2. 贪心算法的应用场景
    区间类问题(区间选点、区间调度、活动选择);
    哈夫曼编码(按字符频率选最优二叉树);
    最小生成树(Prim算法、Kruskal算法);
    最短路径(Dijkstra算法,无负权边);
    找零问题(面值满足贪心性质,如人民币面值)。

  3. 设计贪心算法的关键
    确定贪心策略:需结合问题特征(如区间选点的“右端点排序”);
    证明贪心选择性质:这是贪心算法正确性的核心(若无法证明,贪心可能得到次优解);
    验证最优子结构:确保子问题的最优解能组合成原问题的最优解。

  4. 局限性
    贪心算法并非适用于所有优化问题:若问题不满足“贪心选择性质”,局部最优无法推导出全局最优。例如:
    找零问题:若面值为 [1, 3, 4],找零6元时,贪心选 4+1+1(3枚),但最优解是 3+3(2枚);
    背包问题:0-1背包无法用贪心(物品不可分割),而分数背包可贪心(按单位价值排序)。

posted @ 2025-12-14 18:40  刘懿洋  阅读(4)  评论(0)    收藏  举报