Prim算法和Kruskal算法,都是用来找出图中最小生成树的算法,两个算法有些小差别。
Prim算法
又称普里姆算法,以图上的顶点为出发点,逐次选择到最小生成树顶点集距离最短的顶点为最小生成树的顶点,并加入到该顶点集,直到包含所有的顶点。
步骤:
1.选择一出发点,加入集合A。
2.遍历与集合A中的点相邻的边,找到最短的边,并且不构成回路。
3.将步骤2得到的边的目标点加入集合A。
4.重复2,3直到所有结点都加入到集合A中。
图解:
Kruskal算法
又称克鲁斯卡尔算法,以图上的边为出发点依据贪心策略逐次选择图中最小边为最小生成树的边,且所选的当前最小边与已有的边不构成回路。
步骤:
1.边按照权值从小到大排序。
2.将排序好的权重边依次加入到最小生成树中,如果加入时产生回路就跳过这条边,加入下一条边。
3.将所有节点加入最小生成树时,就找出了最小生成树。
Prim算法和Kruskal算法 :
Kruskal算法,时间复杂度O(nlogn),Prim算法,时间复杂度O(n^2)
Kruskal算法在效率上要比Prim算法快,因为Kruskal只需要对权重边做一次排序,而Prim算法则需要做多次排序。
Kruskal算法主要是针对边来展开,边数少时效率会非常高,所以对于稀疏图有很大的又是,而Prim算法对于稠密图情况会好些。