在解决一些问题的时候,有的问题要得到最优解是非常困难的。这个时候我们就不要再执着于最优解了,因为即便得到了最优解也可能是得不偿失的。采用贪心算法求解这个问题是一种折中的好方法。
所谓贪心算法就是在对问题求解时,总是做出当前看来是最好的选择。也就是说贪心算法并不从整体最优上考虑问题,算法得到的是某种意义上的局部最优解。而局部的最优解叠加在一起便构成了问题的整体最优解,或者近似最优解。正是因为贪心算法思想简单,且算法效率较高,所以在一些问题的解决上有着明显的优势。
下面我们来看一个经典的问题——集合覆盖问题,从中体会一下贪心算法的妙用。
假设你办了个广播节目,要让全美 50个州的听众都收听得到。为此,你需要决定在哪些广播台播出。在每个广播台播出都需要支付费用,因此你力图在尽可能少的广播台播出。现有广播台名单(部分)如下。
表(1)每个广播台和对应覆盖的州
广播台名称 广播台 |
覆盖的州 |
(1) KONE |
ID,NV,UT |
(2) KTWO |
WA,ID,MT |
(3) KTHREE |
OR,NV,CA |
(4) KFOUR |
NV,UT |
(5) KFIVE |
CA,ZA |
如何找出覆盖全美 50个州的最小广播台集合呢?
一般情况下,我们会想到使用穷举法来解决这个问题。假设全美共有n个广播台可供选择,那么每个广播台就有“选择”(1)和“不选择”(0)两种状态,将这n个广播台中每个广播台的两种选择方式任意组合,则共有2^n种组合方式,也就是共有2^n个可能的广播台集合。现在我们要做的就是从这2^n个集合中找出一个集