给定带有权重的无向连通图。 w:E-> {1,2,3,4,5,6,7} - 意味着只有7个权重。 我需要在O(n + m)中使用Prim算法找到生成树,在O(m * a(m,n))中使用Kruskal算法。
我不知道该怎么做,真的需要一些关于权重如何帮助我的指导。
答案 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将是剪切内的节点。然后,您选择穿过切口的最小边缘,即从线内的节点到外部的节点。始终选择重量最轻的边缘。添加新节点后,移动剪切,使其包含新添加的节点。然后重复,直到所有节点都在切割范围内。
该算法的简短摘要是:
<强>的Kruskal:强>
Kruskal与Prim相似,除了你没有切割。所以你总是选择最小的边缘。
我不确定这些算法的确切性能,但我认为Kruskal是O(E log E),Prim的性能基于您用来存储边缘的数据结构。如果使用二进制堆,则搜索最小边缘的速度比使用邻接矩阵存储最小边缘要快。
希望这有帮助!