读《图解算法》07-贪婪算法

教室调度问题

场景

  • 假设有五节课,从早上九点开始,每节课上一个小时,上到 12 点
  • 如何将尽可能多的课程安排在同一个教室

解法

  • 看起来很难,实际上很简单
  • 找出结束最早的课,它就是这个教室里面上的第一节课
  • 接下来,必须选择第一节课后开始的课。同样我们选择结束最早的课
  • 重复上述步骤
  • 所以贪婪算法就是每一步都采取最优解,最终得到的就是全局最优解
  • 但是贪婪算法并不总是完美的,请看背包问题

背包问题

场景

  • 假设你是个贪婪的小偷,背着可装 35 磅的背包,去商场偷东西
  • 共三样,音响 300 美元 30 磅重,电脑 200 美元 20 磅重,吉他 150 美元 15 磅重
  • 如果按照贪婪算法,那么第一步就装了个音响就不能继续了

NP 完全问题

需要计算所有的解,并从中选出最短的那个

  • 还没有找到快速解决的方法,只能用近似算法

定义

  • 以难解著称的问题
    • 旅行商问题
    • 集合覆盖

近似算法

  • 因为旅行商问题,5 个城市就是 5 的阶乘,一旦城市数量多了,根本不可能快速解出来
  • 于是有人就想到了近似算法
  • 随便选择出发的城市,然后每次选择下次要去的城市的时候
  • 都选择最近的那个

如何识别 NP 完全问题

场景

  • 你正在为篮球队挑选队员,需要优秀的后卫,高高的前锋。。。
  • 手里有一个名单,其中每个球员都符合某些要求
  • 从这些名单里选出来
  • 这就是一个集合覆盖的问题
  • 可以使用近似算法
    • 找出符合要求最多的
    • 重复上面,直到满了

关键

  • 不能将问题分解成小问题的
  • 涉及所有组合的
  • 如果问题可以转换成集合覆盖或者旅行商问题
  • 想想旅行商问题和广度优先搜索的最短路径,后面是从 a 点到 b 点的,前者是经由指定点的就是 NP 完全问题