算法第四章作业

贪心策略:我把所有区间按右端点从小到大排序,然后从第一个区间开始,每次选当前区间的右端点作为一个点,然后跳过所有包含这个点的区间,继续处理剩下的第一个不包含这个点的区间,直到所有区间都被覆盖。

证明贪心选择性质:就是要证明存在一个最优解包含我们第一次选的点(即右端点最小的区间的右端点)。设排序后第一个区间是I1,右端点是r1。假设有一个最优解S,如果S已经包含了r1,那就直接成立了。如果S没有包含r1,那么S中一定有一个点p在I1里面(因为I1必须被覆盖),而且p <= r1。那么我们可以用r1替换掉p,得到一个新的解S'。因为所有包含p的区间,它们的左端点<= p,右端点>= r1(因为r1是最小的右端点),所以这些区间也一定包含r1。这样S'还是能覆盖所有区间,并且点数不变,所以S'也是一个最优解,而且包含了r1。这就证明了贪心选择性质。

时间复杂度:代码里用了冒泡排序,所以排序是O(n2),后面遍历一遍是O(n),所以总的是O(n2)。如果用快排可以降到O(n log n)。

对贪心算法的理解:贪心就是每一步都选当前局部最优的,希望这样能得到全局最优。但不是所有问题都能这么干,必须满足贪心选择性质(局部最优能导致全局最优)和最优子结构(问题的最优解包含子问题的最优解)。

posted @ 2025-12-20 21:28  黄熙雯  阅读(0)  评论(0)    收藏  举报