在传统贪婪算法中,采用逐步构造最优解的方法。在每个阶段,都做出一个看上去最优的决策(是局部最优解)。做出贪婪决策的依据称为贪婪准则(
greedy criterion)。
贪心思想的本质是每次都形成局部最优解,就是每次都处理出一个最好的方案。即,贪婪法建议通过一系列步骤来构造问题的解,每一步对目前构造的部分解做一个扩展,直到获得问题的完全解为止
贪婪算法的核心为,
所做的每一步选择都必须满足
- 可行的:即它必须满足问题的约束。
- 局部最优:它是当前步骤中所有可行选择中最佳的局部选择。
- 不可取消:即选择一旦做出,在算法的后面步骤中就无法改变了。
Kruskal算法(稀疏图):
假设一个连通图G=(V,E),通过每次向T添加边来构建最小成本生成树T。按成本的非递减顺序选择要包含在T中的边(每次选取路径的最小值)。如果边不形成循环,则将其添加到T中。因为G是连通的,并且有n>0个顶点,所以将精确地选择n-1个边。
eg(在不行成回路的情况下,每次选取最小权值):
原理:
为实现Kruskal算法,需要用到最小堆和并查集及数据结构。最小堆可以实现对边的权值得排序(也可以不用最小堆,只要将其排序即可)&#