Kruskal 的 MST 算法
给定一个连通图和无向图,该图的生成树是一个子图,它是一棵树并将所有顶点连接在一起。单个图可以有许多不同的生成树。加权、连通和无向图的最小生成树 (MST) 或最小权重生成树是权重小于或等于其他所有生成树权重的生成树。生成树的权重是赋予生成树每条边的权重之和。
以下是使用 Kruskal 算法查找 MST 的步骤
- 按重量的非递减顺序对所有边进行排序。
- 选择最小的边。检查它是否与到目前为止形成的生成树形成一个循环。如果未形成循环,则包括此边。否则,丢弃它。
- 重复步骤#2 直到生成树中有 (V-1) 条边。
MST 的 Prim 算法
和 Kruskal 算法一样,Prim 算法也是一种贪心算法。它从一棵空的生成树开始。这个想法是维护两组顶点。第一组包含已包含在 MST 中的顶点,另一组包含尚未包含的顶点。在每一步,它都会考虑连接这两个集合的所有边,并从这些边中挑选出权重最小的边。拾取边后,它将边的另一个端点移动到包含 MST 的集合。
以下是使用 Prim 算法查找 MST 的步骤
- 创建一个集合 mstSet 来跟踪已经包含在 MST 中的顶点。
- 为输入图中的所有顶点分配一个键值。将所有键值初始化为 INFINITE。将第一个顶点的键值指定为 0,以便它首先被拾取。
- 虽然 mstSet 不包括所有顶点
- 选择 mstSet 中不存在的顶点 u 并且具有最小键值。
- 包括你到 mstSet。
- 更新 u 的所有相邻顶点的键值。要更新键值,请遍历所有相邻顶点。对于每一个相邻的顶点v,如果边uv的权重小于v的前一个key值,更新key值作为uv的权重
Prim’s 和 Kruskal’s 算法都找到了最小生成树并遵循了解决问题的贪心方法,但它们之间几乎没有主要区别。
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. |
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。