二、贪心算法
2.1 概述
- 本质:从眼前某一初始解出发,在每一个阶段都做出当前最优的决策,即贪心策略,逐步逼近给定的目标,尽可能快地求出更好地解。也即以逐步的局部最优达到全局最优。
- 推论:
- 贪心算法在每阶段面临选择时,都做出对眼前来说最有利的选择,并不考虑该选择对将来是否有不良影响。
- 算法不允许回溯,决策一旦做出不可改变。
- 贪心策略决定了算法的性能与表现。
- 算法具有不稳定性,不一定得到全局最优解,但也能得到最优解很好的近似解。因此,在贪心策略确定后应当提供严谨的数学证明,以证明其一定能得到问题的最优解。
- 算法具有高效性,可以很快获得一个问题的解。
2.2 基本要素
2.2.1 最优子结构性质
指一个问题的最优解一定包含其子问题的最优解。换句话来说,也即一个问题能够分解成各个子问题来解决,通过各个子问题的最优解能够得到原问题的最优解,那么原问题的最优解一定包含各个子问题的最优解。
证明问题是否具有最优子结构性质的步骤如下:
- 设出问题的最优解;
- 给出“子问题的解一定是最优的”结论;
- 采用反证法证明Step-2中的结论。
2.2.2 贪心选择性质
指所求问题的整体最优解可以通过一系列局部最优的选择获得,即可通过逐步局部最优选择使最终的选择方案是全局最优的。其中每次所作的选择,可以依赖于之前的选择,但不依赖于将来的选择。
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择能够最终导致问题的一个整体最优解。首先考查问题的一个整体最优解,并证明可修改这个最优解,使其以贪心选择开始。而且作了贪心选择后,原问题简化为一个规模更小的子问题,然后证明最优子结构性质即可。
2.3 实例
- 单源最短路径问题(Dijkstra——迪杰斯特拉)。相关概念界定如下:
- 源点:出发点;
- S S S集合:已经确定到源点最短路径的点构成的集合。
- V − S V-S V−S集合:尚未确定到源点最短路径的点构成的集合。
- 特殊路径:从源点出发,只经过 S S S中的点,到达 V − S V-S V−