算法第四章作业
选点问题分析与贪心算法理解
一、选点问题分析
选点问题要求从给定的n个闭区间中选择最少的点,使得每个区间内都至少包含一个点。贪心算法是解决该问题的有效方法。
贪心策略:将区间按照右端点从小到大排序,然后遍历区间,每次选择当前区间的右端点作为标记点。如果后续区间包含该点,则跳过;否则选择新区间的右端点作为新标记点。
算法正确性证明:该策略满足贪心选择性质,即局部最优选择能导致全局最优解。证明关键在于:按照右端点排序后,选择第一个区间的右端点作为第一个标记点,这个点不仅能覆盖第一个区间,还能尽可能覆盖更多后续区间。若存在一个最优解不包含此点,可以用该点替换最优解中第一个点而不影响结果。
时间复杂度分析:算法主要分为排序和遍历两部分。排序n个区间的时间复杂度为O(n log n),遍历区间的时间复杂度为O(n),因此总时间复杂度为O(n log n)。
#include <stdio.h>
#include <stdlib.h>
#define MAX 100000
int compare(const void *a, const void *b) {
int *intervalA = (int *)a;
int *intervalB = (int *)b;
if (intervalA[1] < intervalB[1]) return -1;
if (intervalA[1] > intervalB[1]) return 1;
return 0;
}
int main() {
int n;
int intervals[MAX][2];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &intervals[i][0], &intervals[i][1]);
}
qsort(intervals, n, sizeof(intervals[0]), compare);
int count = 1;
int current_point = intervals[0][1];
for (int i = 1; i < n; i++) {
if (intervals[i][0] > current_point) {
count++;
current_point = intervals[i][1];
}
}
printf("%d\n", count);
return 0;
}
二、对贪心算法的理解
贪心算法是一种在每一步选择中都采取当前状态下最优决策的算法设计思想,希望通过局部最优选择达到全局最优解。
贪心算法有效的关键条件包括:贪心选择性质(局部最优选择能导致全局最优解)和最优子结构性质(问题的最优解包含子问题的最优解)。当问题同时满足这两个性质时,贪心算法能高效求出最优解。

浙公网安备 33010602011771号