第四章作业
给定数轴上的 n 个闭区间 [aᵢ, bᵢ](其中 i = 1, 2, ..., n),目标是找到最小数量的点,使得每个区间至少包含其中一个点。
形式化表述为:
寻找点集 P,满足:
∀ i ∈ {1, 2, ..., n}, ∃ p ∈ P 使得 aᵢ ≤ p ≤ bᵢ
|P| 最小化
这个问题在实际中有广泛的应用场景,如会议时间安排(每个会议至少有一个关键时间点被记录)、传感器部署(每个监测区域至少有一个传感器)、资源分配等。
二、贪心算法设计
2.1 算法直觉
问题的核心矛盾在于:如何用最少的点覆盖最多的区间。直观上,如果一个点能同时落在多个区间的交集中,那么这个点的"性价比"最高。然而,寻找这样的公共交集可能比较复杂。一个更直接的思路是:既然每个区间都必须被覆盖,我们优先考虑那些"最紧迫"的区间——即右端点最小的区间。
2.2 完整算法步骤
算法:最小点覆盖贪心算法
输入:区间集合 S = {[a₁, b₁], [a₂, b₂], ..., [aₙ, bₙ]}
输出:点集 P
排序阶段:
将所有区间按照右端点 bᵢ 从小到大排序
如果右端点相同,则按左端点 aᵢ 从小到大排序(可选,不影响结果但有助于理解)
初始化:
点集 P = ∅
设当前已覆盖到的最右点为 current_point = -∞
迭代选择:
for i = 1 to n:
if aᵢ > current_point: # 当前区间未被覆盖
将 bᵢ 加入点集 P
current_point = bᵢ
或者等价描述:
选择第一个区间的右端点 b₁ 作为第一个点
移除所有包含 b₁ 的区间
在剩余区间中重复上述过程

浙公网安备 33010602011771号