Prim和Kruskal的算法复杂性

时间:2012-05-28 08:01:15

标签: algorithm minimum-spanning-tree prims-algorithm kruskals-algorithm

给定带有权重的无向连通图。 w:E-> {1,2,3,4,5,6,7} - 意味着只有7个权重。 我需要在O(n + m)中使用Prim算法找到生成树,在O(m * a(m,n))中使用Kruskal算法。

我不知道该怎么做,真的需要一些关于权重如何帮助我的指导。

2 个答案:

答案 0 :(得分:3)

您可以更快地对边缘权重进行排序。

在Kruskal算法中,您不需要O(M lg M)排序,您只需使用计数排序(或任何其他O(M)算法)。因此最终的复杂性是O(M)用于排序,O(Ma(m))用于联合发现阶段。总计为O(Ma(m))。

对于Prim算法的情况。您不需要使用堆,您需要7个列表/队列/数组/任何内容(具有恒定时间插入和检索),每个权重一个。然后当你正在寻找最便宜的外向边缘时,你检查其中一个列表是非空的(从最便宜的一个)并使用该边缘。由于7是常数,因此整个算法在O(M)时间内运行。

答案 1 :(得分:2)

根据我的理解,回答家庭作业并不受欢迎,但这可能对其他人有用,而不仅仅是你;)

<强>的Prim:

Prim是一种用于查找最小生成树(MST)的算法,就像Kruskal一样。 可视化算法的一种简单方法是在一张纸上绘制图形。 然后在所选的所有节点上创建可移动线(切割)。在下面的示例中,集合A将是剪切内的节点。然后,您选择穿过切口的最小边缘,即从线内的节点到外部的节点。始终选择重量最轻的边缘。添加新节点后,移动剪切,使其包含新添加的节点。然后重复,直到所有节点都在切割范围内。

该算法的简短摘要是:

  1. 创建一个集合A,它将包含所选的顶点。它最初将包含一个由您选择的随机起始节点。
  2. 创建另一个集合B.这最初将为空并用于标记所有选定的边。
  3. 选择边E(u,v),即从节点u到节点v的边。边E必须是权重最小的边,其中节点u在集合A内且v不在内部答:(如果有几条边具有相同的重量,任何可以随意选择)
  4. 将边缘(u,v)添加到集合B,将v添加到集合A.
  5. 重复步骤3和4,直到A = V,其中V是所有顶点的集合。
  6. 集合A和B现在描述你生成树! MST将包含A和B中的节点,将描述它们如何连接。
  7. <强>的Kruskal:

    Kruskal与Prim相似,除了你没有切割。所以你总是选择最小的边缘。

    1. 创建一个最初为空的集A.它将用于存储选定的边缘。
    2. 从集合E中选择权重最小的边E,该集合E中不存在A.(u,v)=(v,u),因此您只能在一个方向上遍历边缘。
    3. 将E添加到A。
    4. 重复2和3直到A和E相等,也就是说,直到你选择了所有边缘。
    5. 我不确定这些算法的确切性能,但我认为Kruskal是O(E log E),Prim的性能基于您用来存储边缘的数据结构。如果使用二进制堆,则搜索最小边缘的速度比使用邻接矩阵存储最小边缘要快。

      希望这有帮助!