活动选择问题

  • 最优子结构

QQ截图20210111185349.png

  • 贪心选择: 反复选择最早结束的活动,保留与此活动兼容的活动,重复这一过程,直至不再有剩余活动

QQ截图20210111185644.png
QQ截图20210111190018.png

  • 递归贪心算法

QQ截图20210111190510.png
QQ截图20210111190540.png
QQ截图20210111190606.png
QQ截图20210111191637.png
QQ截图20210111191658.png

  • 迭代贪心算法

QQ截图20210111192656.png


贪心算法原理

  • 设计贪心算法

    • 将最优化问题转化为这样的形式: 对其做出一次选择后,只剩下一个子问题需要求解
    • 证明做出贪心选择后,原问题总是存在最优解,即贪心选择总是安全的
    • 证明做出贪心选择后,剩余的子问题满足性质:其最优解与贪心选择组合即可得到原问题的最优解,这样就得到了最优子结构
  • 应用贪心算法的关键要素

    • 贪心选择性质:我们可以通过做出局部最优(贪心)选择来构造全局最优解

      • 在贪心算法中,我们总是做出当时看来最佳的选择,然后求解剩下的唯一的子问题。
      • 贪心算法进行选择时可能依赖之前做出的选择,但不依赖任何将来的选择或是子问题的解。
      • 与动态规划先求解子问题才能进行第一次选择不同,贪心算法在进行第一次选择之前不求解任何子问题。
      • 一个动态规划算法是自底向上进行计算的,而一个贪心算法通常是自顶向下的,进行一次又一次选择,将给定问题实例变得更小
      • 如果进行贪心选择时我们不得不考虑众多选择,通常意味着可以改进贪心选择,使其更为高效
      • 如:在活动选择问题中,假定我们已经将活动按结束活动时间单调递增顺序排好序,则对每个活动能够只需处理一次。
      • 通过对输入进行预处理或者使用合适的数据结构(通常是优先队列),我们通常可以使贪心选择更迅速,从而得到更高效的算法
    • 最优子结构:一个问题的最优解包含其子问题的最优解

QQ截图20210111210900.png

  • 贪心对动态规划
    • 0-1背包问题:

QQ截图20210111211212.png
QQ截图20210111211428.png
QQ截图20210111211506.png


拟阵和贪心算法

拟阵:
QQ截图20210112093209.png
QQ截图20210112093541.png
QQ截图20210112094159.png
QQ截图20210112094546.png
加权拟阵上的贪心算法
QQ截图20210112100716.png
QQ截图20210112101056.pngQQ截图20210112101139.pngQQ截图20210112101204.png

QQ截图20210112101245.png
QQ截图20210112101405.png
QQ截图20210112101440.png
QQ截图20210112101714.png
QQ截图20210112101900.png
QQ截图20210112102037.png
QQ截图20210112102233.png