贪心算法 - 交换论证法

交换论证的一般步骤

  1. 定义“第 i 步”的贪心选择
    明确你的贪心算法在第 i 步会选什么样的元素/操作,记作 \(g_i\)

  2. 假设存在一个最优解 OPT
    \((o_1, o_2, \dots, o_m)\) 表示它在各步的选择。

  3. 对第 i 步做区分

    • \(o_i = g_i\)
      这一步两者一致,不需要任何修改。我们就把问题“规模”看作从 \(n\) 变为 \(n-1\)(或者可行解剩下的子问题),接着递归/归纳处理第 i+1 步。

    • \(o_i \neq g_i\)
      这时构造一个新的解 OPT′:

      1. 在第 i 步,用 \(g_i\) 替换 \(o_i\)
      2. 保留 OPT 中后面的选择(必要时做少量调整以保证可行性)。
      3. 证明:替换后得到的 OPT′ 的目标值不劣于 OPT。
      4. 同样把剩余子问题规模缩小,递归地对第 i+1 步继续交换论证。
  4. 终止与归纳
    当子问题规模减到最小(如没有元素可选)时,显然贪心和最优解都得到了最优值。向上回溯可得,原问题的贪心解与某个最优解在每一步都保持一致或“不差于”它,故贪心解全局最优。


小贴士

  • 可行性:每次“替换”之后要保证新解仍满足题目所有约束(比如不重叠、交替、容量限制等)。
  • 不退步:重点在于证明“用 \(g_i\) 替换 \(o_i\)”不会让整体目标变差。
  • 规模缩小:要保证替换后,剩下的子问题和原问题“同构”且更小,这样才能用归纳。

掌握了这种“分两种情况(相同/不同)→ 直接递归或交换替换→ 归纳”的套路,就能快速、严谨地给出大多数贪心算法的正确性证明。

posted @ 2025-05-16 14:34  ijpq  阅读(84)  评论(0)    收藏  举报