算法第四章作业

问题分析:选点问题的核心是:在数轴上给定若干闭区间,用最少数量的点覆盖所有区间(每个区间至少包含一个点)。
贪心策略:1、排序:将所有区间按右端点升序排列; 2、选点:初始化选点数量为 0,上一个选点位置为 “无效值”(如 - 1);遍历排序后的区间,若当前区间的左端点 > 上一个选点位置(说明当前区间未被覆盖),则在当前区间的右端点选一个点,同时更新选点数量和上一个选点位置。每次选择当前区间的右端点作为选点,是因为右端点是当前区间能覆盖后续区间的 “最远位置”—— 选右端点能最大化覆盖后续区间的可能性,从而最小化总选点数量。
时间复杂度:遍历 n个区间,时间复杂度为 O(n);对 n个区间按右端点排序,使用 C++ 标准库的 sort(底层为快速排序 / 归并排序),时间复杂度为 O(nlogn);再次遍历 n个区间,时间复杂度为 O(n)。总时间复杂度由 “排序” 这一最高阶项主导,因此为 O(nlogn)。
对贪心算法的理解:贪心算法是一种在每一步选择中都采取当前状态下的最优选择(局部最优),从而希望最终导致全局最优解的算法思想。贪心算法的解题步骤: 1. 问题拆解:将原问题拆解为多个可以独立做局部选择的子问题 2. 确定贪心策略:找到每一步的局部最优选择方向(比如选点问题的 “选区间右端点”、背包问题的 “按单位价值排序”) 3. 证明正确性:必须证明当前的贪心策略满足贪心选择性质和最优子结构,否则贪心算法得到的可能是局部最优,而非全局最优。它具有一定局限性:1. 不是所有问题都适用:如果问题不满足贪心选择性质,贪心算法会得到错误的结果比如 0-1 背包问题,贪心算法(按单位价值排序选择)无法得到全局最优,而必须使用动态规划 2. 无法回溯:一旦做出选择就无法修改,如果当前的局部最优从全局来看是错误的,算法无法修正 3. 对问题的结构要求高:必须能找到明确的、可执行的局部最优选择规则。

posted @ 2025-12-20 22:33  一只大肥羊  阅读(1)  评论(0)    收藏  举报