📜  贪心算法的正确性

📅  最后修改于: 2021-10-26 05:47:37             🧑  作者: Mango

贪心算法贪婪地选择一个候选者(局部最优)并将其添加到当前解决方案中,前提是它不会破坏可行性。如果上述步骤得到的解不是最终解,则重复直到全局最优或得到最终解。

尽管有多种数学策略可用于证明贪心算法的正确性,但我们将尝试直观地证明它并使用矛盾的方法。

贪婪算法通常涉及一系列选择。贪婪算法无法回溯,因此一旦做出选择,他们就会致力于它。因此,他们永远不会做出错误的选择至关重要。

假设S是通过将贪心算法应用于问题而获得的解决方案,而 O 是该问题的最佳解决方案。如果SO相同,那么我们的算法默认是正确的。如果SO不同,那么在堆叠问题的各种局部解决方案时,我们犯了一个错误,选择了一个效率较低的解决方案,导致S而不是O作为解决方案。但是根据贪心算法的定义,我们总是选择局部最优解。
因此使用反证法可以说贪心算法给出了正确的解决方案。

借助 Krushkal 算法可以更好地理解上述证明。

克鲁斯卡尔算法:
这是一种贪心算法,用于寻找图的最小生成树。

Kruskal 算法可以表述如下:
0. 创建一个最初不包含边的最小生成树 T,
1. 在 G 中选择一条边 e,其中
(a) e 不在 T 中,并且……
(b) e 是最小权重,并且……
(c) e 不在 T 中创建循环
2. 如果 T 不包含 G 的所有顶点,则转到步骤 1。

T为获得的树, S为所需的树,使得W(T) > W(S)
很明显,要做到这一点,在某个时间点我们选择了没有最小权重的边,但根据上述算法,我们总是选择最小权重的边。因此 Krushkal 算法将始终给出正确的结果。请注意,V 个顶点的最小生成树必须至少有 V-1 条边,并且不应包含循环。所以我们在上面的步骤中没有选择任何额外的边缘。

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。