递归最小生成树算法

时间:2014-05-21 07:59:53

标签: algorithm graph minimum-spanning-tree

这是查找最小生成树的正确算法。

将图表划分为2个相同连接的部分。找到它的最小生成树。使用连接它们的最小边缘连接它们。我试图得到这个算法的反例,但不能。

2 个答案:

答案 0 :(得分:5)

考虑一个四个节点的图形,以正方形连接,左边缘的成本为10,所有其他边缘的成本为1.如果将图形左右分割为递归步骤,最终会得到一个生成树的成本为12,而不是成本3.

MST不适合“分而治之”的算法。最接近的可能是反向删除算法;无论何时删除边缘(因为它会断开图形),您可以将剩余的步骤视为在该边缘的两侧递归执行。

答案 1 :(得分:1)

您已经描述了分治算法,该算法在确定MST时将不起作用。 Sneftel提供了一个很好的反例,将图递归地分为两个相连的部分会非常昂贵。

相反,找到MST的好方法是使用贪婪算法,例如Prim算法。我们知道贪婪算法会起作用,因为此问题表现出最优的子结构。对于此算法,您需要将图形表示为邻接表。首先,从任意节点开始,并将其添加到访问列表。将来自此节点的所有边添加到最小堆中。在您的MST中包括最便宜的边缘,并将连接节点添加到您的访问列表中。从该节点将所有边添加到您的最小堆中,然后选择最便宜的边到尚未访问的节点。继续这样做,直到访问了所有节点。完成后,您将拥有MST。

您可以使用其他数据结构来存储图形和访问的边,但是我上面概述的结构将最大化运行时间。如果我们使用这些数据结构分析运行时,我们可以看到运行时为O(E log V),这是在删除边后更新元素成本并维护堆的时间。更具体地说,O(log V)修复堆,并且完成了E次。

我还发现了这段2分钟的快速视频,其中以Prim's Algorithm in 2 Minutes

为例概述了Prim的算法。

我希望这些信息对您有所帮助!