Kruskal算法是以边为主要关注对象的最小生成树算法,是最小生成树最佳的算法实现。
其时间复杂度为O(ElogE)(E为边的数量),而Prime算法采用邻接矩阵的方法是O(V^2)(V为顶点数量)。在这里,我所实现的Kruskal算法是基于顶点并查集实现的,边和顶点都有使用,重点关注对象是边。
图论中,有 (V-1<=E<=2V)
步骤1,先对边的权值进行排序,利用快排算法,时间复杂度O(ElogE)
步骤2,遍历边,检查边上两点的集合值,产生情况:
-
若已都设置集合值且相等的话,边为无效边,需剔除之
-
若两点没设置集合值,设置相同的集合值
-
若其中一点没设置集合值,另一点有集合值,并入有集合值的一边
如此遍历完毕后,无效边都将被剔除,只留下最小生成树。
步骤2的时间复杂度为O(E+S*V),其中S为并查集的数量,可看作常数值C,故复杂度为O(E+V)
故算法时间复杂度为O(ElogE+E+V)=O(ElogE)
下面给出Java源代码,其中,Vertex为顶点类,Edge为边类,Map为图类,Kruskal继承Map。