第四章作业
贪心算法核心解析与选点问题应用
一、贪心算法核心理解
贪心算法是一种逐步局部最优决策的启发式算法,每一步都选择当前状态下最优(或较优)的选项,不回溯、不考虑未来全局影响,最终期望通过局部最优累积得到全局最优,核心是贪心策略设计与全局最优可行性验证。
二、选点问题(经典区间覆盖类)分析
- 问题定义(标准场景)
给定数轴上若干个闭区间 [a₁,b₁], [a₂,b₂], ..., [aₙ,bₙ],选择最少的点,使得每个区间内至少包含一个选点,求最少选点数量。
- 贪心策略设计
核心逻辑:优先选区间右端点作为选点,具体步骤如下:
-
排序:将所有区间按 右端点从小到大 排序(核心预处理,保证局部最优可推导全局最优);
-
选点:初始化第一个选点为第一个区间的右端点 x = b₁,计数 count = 1;
-
遍历:依次检查后续区间,若当前区间左端点 aᵢ > x(当前选点未覆盖该区间),则选该区间右端点作为新选点 x = bᵢ,计数 count += 1;
-
结束:遍历完成后,count 即为最少选点数量。
-
贪心选择性质证明(关键核心)
贪心选择性质定义
算法的第一个选择(选第一个区间右端点 b₁)是全局最优解的一部分,即存在一个全局最优解包含该选择。
证明过程(反证法)
-
假设全局最优解 S 中,第一个选点为 x₀,且 x₀ ≠ b₁(不选第一个区间右端点);
-
因 x₀ 需覆盖第一个区间 [a₁,b₁],故 x₀ ≤ b₁(区间闭区间,左端点 ≤ 选点 ≤ 右端点);
-
构造新解 S':将 S 中的 x₀ 替换为 b₁,其余选点不变;
-
验证 S' 有效性:
◦ 第一个区间仍被覆盖(b₁ 属于 [a₁,b₁]);
◦ 后续区间:若原 x₀ 覆盖某区间 [aᵢ,bᵢ],则 aᵢ ≤ x₀ ≤ b₁ ≤ bᵢ(因区间已按右端点排序,b₁ ≤ bᵢ),故 b₁ 也覆盖 [aᵢ,bᵢ];
- 结论:S' 仍为全局最优解(选点数量与 S 相同),且包含第一个选择 b₁,故贪心选择性质成立。
全局最优性推导
基于贪心选择性质,每一步局部最优选择(选当前区间右端点)均可纳入全局最优解,逐步累积后最终结果即为全局最优。
- 时间复杂度分析
• 排序:区间排序时间复杂度为 O(n log n)(算法核心耗时步骤);
• 遍历:遍历所有区间仅需 O(n);
• 总复杂度:O(n log n)(由排序步骤主导,为最优复杂度,无法进一步优化)。
- 拓展:其他选点场景贪心策略适配
• 场景1(区间选点覆盖所有点):给定若干点,选最少区间覆盖所有点 → 按区间左端点从小到大排序,优先选左端点包含当前未覆盖点、且右端点最大的区间;
• 场景2(二维平面选点):如矩形覆盖选点,需结合轴排序(如x轴优先),核心逻辑仍为“优先选边界极值点”,本质是一维策略的二维延伸。
三、贪心算法核心总结
-
适用前提:问题需满足 贪心选择性质(局部最优可纳入全局最优)和 最优子结构性质(全局最优包含子问题最优);
-
核心步骤:问题建模 → 设计贪心策略 → 证明性质 → 实现与复杂度分析;
-
关键特点:高效(通常线性或线性对数复杂度)、简洁,但并非所有问题适用(如0-1背包不可用,完全背包可用),核心是策略合理性验证。
浙公网安备 33010602011771号