用于MST的Kruskal算法
给定一个连通图和无向图,该图的生成树是一个子图,该子图是一棵将所有顶点连接在一起的树。单个图可以具有许多不同的生成树。加权,连接和无向图的最小生成树(MST)或最小权重生成树是权重小于或等于其他所有生成树的权重的生成树。生成树的权重是赋予生成树的每个边缘的权重之和。
以下是使用Kruskal算法查找MST的步骤
- 按重量的递减顺序对所有边缘进行排序。
- 选择最小的边缘。检查它是否与到目前为止形成的生成树一起形成一个循环。如果未形成循环,则包括该边。否则,将其丢弃。
- 重复步骤2,直到生成树中有(V-1)个边。
用于MST的Prim算法
像Kruskal算法一样,Prim算法也是Greedy算法。它从一棵空的生成树开始。这个想法是维持两组顶点。第一组包含MST中已包含的顶点,另一组包含尚未包含的顶点。在每一步中,它都会考虑连接两组的所有边,并从这些边中选取最小的权重边。拾取边缘后,它将边缘的另一个端点移动到包含MST的集合。
以下是使用Prim算法查找MST的步骤
- 创建一个集合mstSet,以跟踪MST中已包含的顶点。
- 为输入图中的所有顶点分配一个键值。将所有键值初始化为INFINITE。将第一个顶点的键值指定为0,以便首先选择它。
- 虽然mstSet不包括所有顶点
- 选择一个mstSet中不存在且具有最小键值的顶点u。
- 将u包含到mstSet中。
- 更新u的所有相邻顶点的键值。要更新键值,请遍历所有相邻的顶点。对于每个相邻顶点v,如果边缘uv的权重小于v的先前键值,则将键值更新为uv的权重
Prim算法和Kruskal算法都找到最小生成树并遵循贪婪方法解决问题,但是它们之间几乎没有主要区别。
Prim’s Algorithm | Kruskal’s Algorithm |
---|---|
It starts to build the Minimum Spanning Tree from any vertex in the graph. | It starts to build the Minimum Spanning Tree from the vertex carrying minimum weight in the graph. |
It traverses one node more than one time to get the minimum distance. | It traverses one node only once. |
Prim’s algorithm has a time complexity of O(V2), V being the number of vertices and can be improved up to O(E + log V) using Fibonacci heaps. | Kruskal’s algorithm’s time complexity is O(E log V), V being the number of vertices. |
Prim’s algorithm gives connected component as well as it works only on connected graph. | Kruskal’s algorithm can generate forest(disconnected components) at any instant as well as it can work on disconnected components |
Prim’s algorithm runs faster in dense graphs. | Kruskal’s algorithm runs faster in sparse graphs. |