贪心算法的严谨证明:区间与点配对问题
在算法问题中,我们经常遇到需要在数轴上将一组区间与一组点进行配对,以实现配对数量最大化的场景。一个直观的贪心策略是:优先考虑那些“限制性”更强的区间。本文将详细阐述并证明一个经典的贪心算法:将所有区间按右端点升序排序,然后依次为每个区间选择其范围内最靠左的可用点进行配对。我们将使用交换论证(Exchange Argument)方法,一步步揭示该策略为何能够导出全局最优解。
问题描述
给定数轴上的一组区间集合 I={i1,i2,…,im} 和一组点集合 P={p1,p2,…,pn}。
- 每个区间 ik 表示为 [lk,rk]。
- 一个区间 ik 和一个点 pj 可以配对,当且仅当 lk≤pj≤rk。
目标是找到一个规模最大的配对集合 M⊆I×P,满足以下条件:
- 集合 M 中的每个区间至多被使用一次。
- 集合 M 中的每个点至多被使用一次。
- 对于 M 中的任一配对 (ik,pj),必须满足 pj∈[lk,rk]。
贪心策略
我们提出以下贪心策略来解决此问题:
- 排序区间: 将所有区间 ik∈I 按照其右端点 rk 从小到大进行升序排序。
- 迭代配对: 依次遍历排序后的区间。对于当前区间 i=[l,r],从所有它能覆盖且尚未被配对的点中,选择位置最靠左(坐标值最小)的点 p∗ 与之配对。
- 更新状态: 如果找到了这样的点 p∗,则记录配对 (i,p∗),并将点 p∗ 标记为“已配对”。处理下一个区间,直到所有区间都被考察完毕。
策略核心思想: 按右端点排序,意味着我们优先处理那些“即将结束”的区间。为这些区间选择最左边的点,是为了将“更靠右”的点资源留给那些右端点更大的区间,因为后者有更大的灵活性去覆盖靠右的点。
正确性证明:交换论证
我们将使用经典的交换论证 (Exchange Argument) 来证明上述贪心策略的正确性。证明的核心是表明,贪心算法做出的每一步选择,都可以被包含在某个最优解中。
设 SG 是由我们的贪心策略产生的配对集合。
设 SOPT 是任意一个最优解(即规模最大的配对集合)。
我们的目标是证明 ∣SG∣=∣SOPT∣。
核心引理:贪心选择性质 (Greedy Choice Property)
贪心策略的第一步选择是“安全”的,即它存在于某个最优解中。
证明:
令贪心策略做出的第一个选择为 g1=(i1,p1),其中:
- i1 是所有区间中右端点 r1 最小的区间。
- p1 是 i1 所能覆盖的、所有可用点中最靠左的点。
现在,我们来分析最优解 SOPT:
情况 1:SOPT 包含了贪心选择 g1
如果 (i1,p1)∈SOPT,那么贪心选择已经是该最优解的一部分,引理成立。
情况 2:SOPT 不包含贪心选择 g1
如果 (i1,p1)∈/SOPT,则必然存在以下两种子情况之一:
子情况 2a:i1 在 SOPT 中未被配对
由于 SOPT 是最优解,如果点 p1 也未被配对,我们可以直接将 (i1,p1) 加入 SOPT,得到一个规模更大的解,这与 SOPT 的最优性矛盾。因此,p1 必然在 SOPT 中与另一个区间 i1′ 配对,即 (i1′,p1)∈SOPT。
我们可以构造一个新的解 SOPT′:
SOPT′=SOPT∖{(i1′,p1)}∪{(i1,p1)}在这个新解中,我们将 p1 的配对对象从 i1′ 换成了 i1。由于 p1∈i1,新配对 (i1,p1) 是合法的。SOPT′ 的规模与 SOPT 相同,因此它也是一个最优解,并且它包含了贪心选择 g1。
子情况 2b:i1 在 SOPT 中与另一个点 p1′ 配对
即 (i1,p1′)∈SOPT,且 p1′=p1。
同时,由于 p1 是一个必须考虑的点(否则可加入 (i1,p1) 提升解),它必然在 SOPT 中与另一个区间 i1′ 配对,即 (i1′,p1)∈SOPT。
我们已知:
- 根据贪心选择,p1 是 i1 覆盖的最左点,所以 p1<p1′。
- 根据贪心选择,i1 是右端点最小的区间,所以 ri1≤ri1′。
现在,我们执行一次交换操作,构造新解 SOPT′:
SOPT′=SOPT∖{(i1,p1′),(i1′,p1)}∪{(i1,p1),(i1′,p1′)}这个操作的本质是:让 i1 与 p1 配对(满足贪心选择),让 i1′ 与 p1′ 配对。
新解 SOPT′ 的规模与 SOPT 相同。我们只需验证新的配对 (i1′,p1′) 是否合法,即 p1′ 是否在区间 i1′=[li1′,ri1′] 内。
验证左边界:
- 因为 (i1′,p1)∈SOPT 是合法配对,所以 li1′≤p1。
- 我们已知 p1<p1′。
- 因此,li1′≤p1<p1′,左边界条件 li1′≤p1′ 成立。
验证右边界:
- 因为 (i1,p1′)∈SOPT 是合法配对,所以 p1′≤ri1。
- 我们已知 ri1≤ri1′。
- 因此,p1′≤ri1≤ri1′,右边界条件 p1′≤ri1′ 成立。
两个边界条件均成立,证明新配对 (i1′,p1′) 是合法的。
我们成功地将任意一个不含 g1 的最优解 SOPT 转化为了一个包含 g1 的、规模相同的新最优解 SOPT′。
综上所述,贪心选择 g1 是一个安全选择。
最优子结构与归纳
证明了第一个贪心选择是安全的之后,我们实际上将原问题转化为了一个规模更小的子问题。
将 i1 和 p1 从各自的集合中移除,剩下的问题是在 I∖{i1} 和 P∖{p1} 中寻找最大配对。我们已经证明,存在一个最优解,其剩余部分 SOPT′∖{g1} 正是这个子问题的最优解。
由于原问题具有最优子结构 (Optimal Substructure),并且我们证明了每一步的贪心选择都是安全的,通过数学归纳法可以得出,将此贪心策略执行到底,所得到的解 SG 的规模必然与最优解 SOPT 的规模相等。
结论
通过严谨的交换论证,我们证明了“按右端点排序,为每个区间选择最左边的可用点”这一贪心策略的正确性。它确保了在每一步决策时,都为后续的区间留下尽可能多的选择空间,从而导出全局最优解。这个例子是理解贪心算法设计和证明的经典范例。