Prim算法和Kruskal算法的区别
在这篇文章中,我们将了解Prim算法和Kruskal算法之间的区别。
Kruskal算法用于最小生成树 (MST)
- 给定一个连通且无向的图,该图的生成树是连接所有顶点的子图,且该子图是一棵树。
- 一个图可以有多棵生成树。
- 对于一个加权的、连通的、无向的图,最小生成树 (MST)(也称为最小权重生成树)是一棵生成树,其权重小于或等于所有其他生成树的权重。
- 生成树的权重是通过将与生成树中每条边关联的权重加起来得到的。
- 最小生成树可以从图中权重最小的顶点构建。
- 每个节点只遍历一次。
- 它在稀疏图中运行速度很快。
- 时间复杂度为 O(E log V),其中 V 是顶点数。
- 它也可以处理不连通的组件。
使用Kruskal算法查找MST的步骤
- 按关联权重升序对边进行排序。
- 选择最小的边。
- 检查它是否与到目前为止形成的生成树构成环。
- 如果没有形成环,则必须包含此边。
- 否则,可以将其丢弃。
- 重复步骤2、3、4,直到生成树包含V-1条边。
Prim算法最小生成树 (MST)
- 这类似于Kruskal算法,即它是一种贪心算法。
- 它从一个空的生成树开始。维护两组顶点。
- 第一组将包含已包含在MST中的顶点,而另一组将包含尚未包含的顶点。
- 在每一步中,算法都会考虑所有连接这两组的边。然后,它从这些边中选择权重最小的边。
- 在此步骤之后,算法移动到包含MST的集合的边的另一端点。
- 最小生成树可以从图中的任何顶点构建。
- 一个节点被多次遍历以获得最小距离值。
- 它的时间复杂度为 O(V2),其中 V 是顶点数。使用斐波那契堆可以将此时间复杂度提高到 O(E + log V)。
- 它在稠密图中运行速度很快。
- 它给出连通分量,并且仅适用于连通图。
使用Prim算法查找MST的步骤
- 创建一个mstSet,用于跟踪已包含在MST中的顶点。
- 为输入图的所有顶点分配一个键值。
- 键值最初设置为“INFINITE”。
- 为第一个顶点分配键值0,以便可以首先选择它。
- 当mstSet不包含所有顶点时,遵循以下步骤。
- 选择一个不在mstSet中且具有最小键值的顶点“u”。
- 此“u”现在包含在mstSet中。
- 更新“u”的所有相邻顶点的键值。
- 这可以通过遍历所有相邻顶点来完成。
- 对于每个相邻顶点“v”,如果边“u”-“v”的权重小于“v”的先前键值,则将键值更新为“u-v”的权重。
广告