贪婪法通过一系列步骤来构造问题的解,每一步对目前构造的部分解做一个扩展,直到获得问题的完整解为止。所作的每一步必须:
- 可行
- 局部最优
- 不可取消
贪婪法的困难之处在于如何证明某一贪婪算法能获得最优解。常用的证明是使用数学归纳法。
第二个证明方法是证明在接近问题目标的过程中,贪婪法每一步的选择都不比其他任何算法差。
第三个证明是基于算法的输出。
贪婪技术背后复杂的理论是拟阵。
Prim算法
最小生成树
Prim算法通过一系列不断扩张来构造一棵最小生成树。从图中的任一顶点开始,每一次迭代时一贪婪的方式扩张当前子树,即把不在树中的最近顶点添加到树中。
Kruskal算法
Kruskal算法生成最小生成树,将边按照权重的非递减顺序排列,然后每次从中挑出最短的边加到当前的子树中,如果构成了回路则把这条边跳过。
Dijkstra算法
单起点最短路径问题,求出它到所有其他顶点的最短路径。
Dijkstra算法按照从给定顶点到图中顶点的距离,顺序求出最短的路径。
哈夫曼树和编码
最短变长前缀码