Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.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
C++ 以最快的方式运行prim';坐标范围越来越大_C++_Algorithm - Fatal编程技术网

C++ 以最快的方式运行prim';坐标范围越来越大

C++ 以最快的方式运行prim';坐标范围越来越大,c++,algorithm,C++,Algorithm,我希望有人能给我一个通用的方法来计算MST,以解决一个从格式如下的输入工作的问题: <number of vertices> <x> <y> <x> <y> ... ... 我了解如何实现prim的算法,但我一直在寻找一种(使用prim的算法)执行所需内存/时间最少的方法。我应该将所有内容存储在邻接矩阵中吗?如果顶点数增加到10000,那么解决这个问题的最佳方法是什么(假设使用了prim)?您真的需要使用prim吗 一种简单的方法

我希望有人能给我一个通用的方法来计算MST,以解决一个从格式如下的输入工作的问题:

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

...

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

您真的需要使用prim吗


一种简单的方法是每次添加节点时使用Kruskal算法重新计算生成树(仅使用以前选择的边)。因为Kruskal是O(E log E),在每次迭代中,您将精确地计算2*V-1边(来自上一个树的V-1+来自新添加节点的V)。每次插入都需要O(V log V)。

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

这可以通过使用二进制堆数据结构来改进,该结构的图形由邻接列表表示。使用这种方法,复杂性将是
O(| E | log | V |)

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

注:
E
表示图形中的边数,
V
表示图形中的顶点数

STL
已经实现了一个二进制堆数据结构,
std::priority_queue
std::priority_队列
调用算法库中的
算法。您还可以使用
std::vector
(或具有随机访问迭代器的任何其他容器)并调用
make_heap
push_heap
pop_heap
,等等。这些都在算法库中。更多信息请点击此处:


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

请注意,Prim和Kruskal的算法都可以用于新的图形(您甚至可以从一个“特殊”节点开始;-)如果您有一个密集的图形(图形有很多边),Prim的算法会更快对不起,你能详细说明一下吗?考虑到我们不知道哪些顶点连接到其他顶点(我们唯一能做的假设是该图是完整的),kruskal的速度是否仍然比prim的快?而且,每次插入的O(VlogV)不意味着总计算的O(V^2logV)吗?我们不能用prim+邻接矩阵来计算O(V^2)中的MST吗?对不起,这没有什么帮助。我知道在某些情况下prim的复杂性,但我在具体选择如何解决这个问题时遇到了困难。使用复杂度为O(| E | log | V |)的邻接列表比使用复杂度为O(| V | ^2)的邻接列表要慢,因为此问题(完整图形)中的边数为| V | ^2。因此,使用二进制堆将导致我的问题。首先,您所说的是错误的
O(| E | log(| V |))
O(V^2)
快。听起来好像你想让人给你写算法。您询问运行Prim算法的最快方法是什么,这将是使用堆数据结构并用邻接列表表示图形。您可以使用数组或
std::vector
来表示图形。如果你想要实际的代码,请看这个链接:我不想让任何人为我写任何东西,请不要假设是这样。当E=V^2(在完整图中)时,O(| E | log(| V |))比O(V^2)快多少?在完整图中,
E=(V(V-1))/2
,所以从技术上讲它不是
V^2
。此外,此链接还讨论了Prim算法的时间复杂性: