Kurskal算法

Kruskal算法是以边为主要关注对象的最小生成树算法,是最小生成树最佳的算法实现。

其时间复杂度为O(ElogE)(E为边的数量),而Prime算法采用邻接矩阵的方法是O(V^2)(V为顶点数量)。在这里,我所实现的Kruskal算法是基于顶点并查集实现的,边和顶点都有使用,重点关注对象是边。

图论中,有 (V-1<=E<=2V)

步骤1,先对边的权值进行排序,利用快排算法,时间复杂度O(ElogE)

步骤2,遍历边,检查边上两点的集合值,产生情况:

  1. 若已都设置集合值且相等的话,边为无效边,需剔除之

  2. 若两点没设置集合值,设置相同的集合值

  3. 若其中一点没设置集合值,另一点有集合值,并入有集合值的一边

如此遍历完毕后,无效边都将被剔除,只留下最小生成树。

步骤2的时间复杂度为O(E+S*V),其中S为并查集的数量,可看作常数值C,故复杂度为O(E+V)

故算法时间复杂度为O(ElogE+E+V)=O(ElogE)

下面给出Java源代码,其中,Vertex为顶点类,Edge为边类,Map为图类,Kruskal继承Map。

 

猜你喜欢

转载自www.cnblogs.com/Jimmy-hacks/p/11612117.html