贪心算法
贪心算法和动态规划一样,都适用于求解最优化问题。贪心算法不是对所有问题都能得到整体最优解,可用贪心算法求解的问题需要具有贪心选择性质和最优子结构性质。
基本思想
贪心算法总是作出在当前看来是最好的选择(即贪心选择)。也就是说贪心算法并不从整体最优上加以考虑,它所作出的选择只是在某种意义上的局部最优选择。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广的许多问题它能产生整体最优解。
基本要素
贪心算法通过一系列的选择来得到问题的解。它所做的每一个选择都是当前状态下局部最好选择(即贪心选择)。这种启发式的策略并不总能奏效,然而在许多情况下确能达到预期目的。
注:对于一个具体的问题,只要具有贪心选择性质和最优子结构性质,就可以用贪心算法来求解。
贪心选择性质
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择(即贪心选择)来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所做的贪心选择最终导致问题的整体最优解。通常通过如下方法证明:首先考察问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。做了贪心选择后,原问题简化为规模更小的类似子问题(<-- 证明贪心选择后的问题简化为规模更小的类似子问题的关键在于利用该问题的最优子结构性质)。然后,用数学归纳法证明,通过每一步做贪心选择,最终可得到问题的整体最优解。
最优子结构性质
当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。
贪心算法与动态规划
相同点:都适用于求解最优化问题,都具有最优子结构性质
不同点:在动态规划算法中,每步所做的选择往往依赖于相关子问题的解。因而只有在解出相关子问题后,才能做出选择。而在贪心算法中,仅在当前状态下做出最好选择,即局部最优选择。然后再去解做出这个选择后产生的相应的子问题。贪心算法所做的贪心选择可以依赖于以往所做过的选择,但决不依赖于将来所做的选择,也不依赖于子问题的解。
正是由于这种差别,动态规划算法通常以自底向上的方式解各子问题,而贪心算法则通常以自顶向下的方式进行,以迭代的方式作出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题。