贪心算法 - 交换论证法
交换论证的一般步骤
-
定义“第 i 步”的贪心选择
明确你的贪心算法在第 i 步会选什么样的元素/操作,记作 \(g_i\)。 -
假设存在一个最优解 OPT
用 \((o_1, o_2, \dots, o_m)\) 表示它在各步的选择。 -
对第 i 步做区分
-
若 \(o_i = g_i\)
这一步两者一致,不需要任何修改。我们就把问题“规模”看作从 \(n\) 变为 \(n-1\)(或者可行解剩下的子问题),接着递归/归纳处理第 i+1 步。 -
若 \(o_i \neq g_i\)
这时构造一个新的解 OPT′:- 在第 i 步,用 \(g_i\) 替换 \(o_i\)。
- 保留 OPT 中后面的选择(必要时做少量调整以保证可行性)。
- 证明:替换后得到的 OPT′ 的目标值不劣于 OPT。
- 同样把剩余子问题规模缩小,递归地对第 i+1 步继续交换论证。
-
-
终止与归纳
当子问题规模减到最小(如没有元素可选)时,显然贪心和最优解都得到了最优值。向上回溯可得,原问题的贪心解与某个最优解在每一步都保持一致或“不差于”它,故贪心解全局最优。
小贴士
- 可行性:每次“替换”之后要保证新解仍满足题目所有约束(比如不重叠、交替、容量限制等)。
- 不退步:重点在于证明“用 \(g_i\) 替换 \(o_i\)”不会让整体目标变差。
- 规模缩小:要保证替换后,剩下的子问题和原问题“同构”且更小,这样才能用归纳。
掌握了这种“分两种情况(相同/不同)→ 直接递归或交换替换→ 归纳”的套路,就能快速、严谨地给出大多数贪心算法的正确性证明。
本文来自博客园,作者:ijpq,转载请注明原文链接:https://www.cnblogs.com/ijpq/p/18879972

浙公网安备 33010602011771号