📜  MST 的 Prim 算法和 Kruskal 算法之间的区别

📅  最后修改于: 2021-09-12 10:46:14             🧑  作者: Mango

Kruskal 的 MST 算法

给定一个连通图和无向图,该图的生成树是一个子图,它是一棵树并将所有顶点连接在一起。单个图可以有许多不同的生成树。加权、连通和无向图的最小生成树 (MST) 或最小权重生成树是权重小于或等于其他所有生成树权重的生成树。生成树的权重是赋予生成树每条边的权重之和。

以下是使用 Kruskal 算法查找 MST 的步骤

  1. 按重量的非递减顺序对所有边进行排序。
  2. 选择最小的边。检查它是否与到目前为止形成的生成树形成一个循环。如果未形成循环,则包括此边。否则,丢弃它。
  3. 重复步骤#2 直到生成树中有 (V-1) 条边。

MST 的 Prim 算法

和 Kruskal 算法一样,Prim 算法也是一种贪心算法。它从一棵空的生成树开始。这个想法是维护两组顶点。第一组包含已包含在 MST 中的顶点,另一组包含尚未包含的顶点。在每一步,它都会考虑连接这两个集合的所有边,并从这些边中挑选出权重最小的边。拾取边后,它将边的另一个端点移动到包含 MST 的集合。

以下是使用 Prim 算法查找 MST 的步骤

  1. 创建一个集合 mstSet 来跟踪已经包含在 MST 中的顶点。
  2. 为输入图中的所有顶点分配一个键值。将所有键值初始化为 INFINITE。将第一个顶点的键值指定为 0,以便它首先被拾取。
  3. 虽然 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 现场工作专业课程学生竞争性编程现场课程。