在越来越多的坐标系上运行prim的最快方法

时间:2013-04-19 01:52:09

标签: c++ algorithm

我希望有人可以给我一个计算MST的通用方法,以解决因格式化的输入而产生的问题:

<number of vertices>
<x> <y>
<x> <y>
...

我理解如何实现prim的算法,但我正在寻找一种方法(使用prim的算法)将需要最少的内存/时间来执行。我应该将所有内容存储在邻接矩阵中吗?如果顶点的数量增加到10000,那么解决这个问题的最佳方法是什么(假设使用了prim)?

2 个答案:

答案 0 :(得分:1)

你真的需要使用Prim's吗?

一种简单的方法是每次添加节点时使用Kruskal算法重新计算生成树(仅使用先前选定的边)。由于Kruskal是O(E log E),并且在每次迭代中,您将准确计算2 * V-1个边缘(来自先前树的V-1 +来自新添加节点的V)。每次插入都需要O(V log V)。

答案 1 :(得分:0)

如果你有一个密集的图形(一个有很多边缘的图形),Prim的算法会更快。如果使用邻接矩阵,Prim算法的复杂度将为O(|V|^2)

这可以通过使用具有邻接列表表示的图的二进制堆数据结构来改进。使用此方法,复杂性为O(|E|log|V|)

使用具有邻接列表的斐波纳契堆数据结构会更快,复杂度为O(|E| + |V|log|V|)

注意:E表示图表中的边数,而V表示图表中的顶点数。

STL已经实现了二进制堆数据结构std::priority_queuestd::priority_queue调用algoritm库中的heap算法。您还可以使用std::vector(或任何其他具有随机访问迭代器的容器)并调用make_heappush_heappop_heap等。这些都在algoritm库中。更多信息:http://www.cplusplus.com/reference/algorithm/

您也可以实现自己的堆数据结构,但这可能过于复杂,不值得获得性能优势。