Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 普里姆和克鲁斯卡尔';s算法复杂度_Algorithm_Minimum Spanning Tree_Prims Algorithm_Kruskals Algorithm - Fatal编程技术网

Algorithm 普里姆和克鲁斯卡尔';s算法复杂度

Algorithm 普里姆和克鲁斯卡尔';s算法复杂度,algorithm,minimum-spanning-tree,prims-algorithm,kruskals-algorithm,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算法找到一个生成树 我不知道该怎么做,真的需要一些关于体重如何帮助我的指导。据我所知,回答家庭作业并不流行,但这可能对其他人有用,而不仅仅是你;) Prim: Prim是一种寻找最小生成树(MST)的算法,就像Kruskal一样。 可视化算法的一个简单方法是在一张纸上画出图形。 然后在选定的所有节点上创建一条可移动线(剪切)。

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


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

据我所知,回答家庭作业并不流行,但这可能对其他人有用,而不仅仅是你;)

Prim:

Prim是一种寻找最小生成树(MST)的算法,就像Kruskal一样。 可视化算法的一个简单方法是在一张纸上画出图形。 然后在选定的所有节点上创建一条可移动线(剪切)。在下面的示例中,集合A将是切割内的节点。然后选择贯穿切割的最小边,即从线内侧的节点到线外侧的节点。始终选择权重最低的边。添加新节点后,移动剪切,使其包含新添加的节点。然后重复此操作,直到所有节点都在剪切范围内

该算法的简短总结如下:

  • 创建一个集合a,其中将包含所选垂直。它最初将包含一个由您选择的随机起始节点
  • 创建另一个集合B。该集合最初为空,用于标记所有选定的边
  • 选择边E(u,v),即从节点u到节点v的边。边E必须是权重最小的边,其节点u在集合A内,而v不在A内。(如果有多条权重相等的边,可以随机选择任何一条)
  • 将边(u,v)添加到集合B,将v添加到集合A
  • 重复步骤3和4,直到A=V,其中V是所有垂直的集合
  • 集合A和B现在描述生成树!MST将包含A中的节点,B将描述它们如何连接
  • Kruskal:

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

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


    希望这有帮助

    据我所知,回答家庭作业并不流行,但这可能对你以外的其他人有用;)

    Prim:

    Prim是一种寻找最小生成树(MST)的算法,就像Kruskal一样。 可视化算法的一个简单方法是在一张纸上画出图形。 然后在选定的所有节点上创建一条可移动线(剪切)。在下面的示例中,集合A将是切割内的节点。然后选择贯穿切割的最小边,即从线内侧的节点到线外侧的节点。始终选择权重最低的边。添加新节点后,移动剪切,使其包含新添加的节点。然后重复此操作,直到所有节点都在剪切范围内

    该算法的简短总结如下:

  • 创建一个集合a,其中将包含所选垂直。它最初将包含一个由您选择的随机起始节点
  • 创建另一个集合B。该集合最初为空,用于标记所有选定的边
  • 选择边E(u,v),即从节点u到节点v的边。边E必须是权重最小的边,其节点u在集合A内,而v不在A内。(如果有多条权重相等的边,可以随机选择任何一条)
  • 将边(u,v)添加到集合B,将v添加到集合A
  • 重复步骤3和4,直到A=V,其中V是所有垂直的集合
  • 集合A和B现在描述生成树!MST将包含A中的节点,B将描述它们如何连接
  • Kruskal:

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

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


    希望这有帮助

    可以更快地排序边权重

    在Kruskal算法中,您不需要O(M lgm)排序,您只需要使用计数排序(或任何其他O(M)算法)。所以最后的复杂度是O(M)用于排序,O(Ma(M))用于联合查找阶段。总的来说是O(Ma(m))


    对于Prim算法的情况。您不需要使用heap,您需要7个列表/队列/数组/任何东西(具有恒定的插入和检索时间),每个权重对应一个。然后,当您寻找最便宜的传出边缘时,您会检查这些列表中是否有一个是非空的(从最便宜的列表中),并使用该边缘。因为7是一个常数,所以整个算法在O(M)时间内运行。

    您可以更快地对边权重排序

    在Kruskal算法中,不需要O(mlgm)sor