设计PRIM算法最有效的数据结构是什么? 我在C++中用一个哈希表来设计一个图表。哈希表使用开放寻址,图形的边数不超过50000条。我还设计了一个PRIM算法来寻找图的最小生成树。我的PRIM算法为以下数据创建存储:

设计PRIM算法最有效的数据结构是什么? 我在C++中用一个哈希表来设计一个图表。哈希表使用开放寻址,图形的边数不超过50000条。我还设计了一个PRIM算法来寻找图的最小生成树。我的PRIM算法为以下数据创建存储:,c++,data-structures,graph,hashtable,minimum-spanning-tree,C++,Data Structures,Graph,Hashtable,Minimum Spanning Tree,一个名为Q的表,将所有节点放在开头。在每个循环中,访问一个节点,在循环结束时,从Q中删除该节点 一个名为Key的表,每个节点一个。必要时更改键(每个循环至少一次) 名为Parent的表,每个节点一个。在每个循环中,都会在此表中插入一个新元素 名为A的表。程序在这里存储最小生成树的最终边。返回的是那张桌子 假设图形有50000条边,那么创建这些表最有效的数据结构是什么 我可以使用数组吗 我担心每个数组的元素都会太多。当然,我甚至不考虑使用链表,因为每个元素的访问将花费很多时间。我可以用哈希表吗

一个名为
Q
的表,将所有节点放在开头。在每个循环中,访问一个节点,在循环结束时,从Q中删除该节点

  • 一个名为
    Key
    的表,每个节点一个。必要时更改键(每个循环至少一次)

  • 名为
    Parent
    的表,每个节点一个。在每个循环中,都会在此表中插入一个新元素

  • 名为
    A
    的表。程序在这里存储最小生成树的最终边。返回的是那张桌子

  • 假设图形有50000条边,那么创建这些表最有效的数据结构是什么

    我可以使用数组吗

    我担心每个数组的元素都会太多。当然,我甚至不考虑使用链表,因为每个元素的访问将花费很多时间。我可以用哈希表吗

    但同样,这些元素对很多人来说都是非常重要的。我的算法适用于由几个节点(10或20个)组成的图,但我对由40000个节点组成的图的情况表示怀疑。非常感谢您的任何建议。

    (因为评论有点长):对于非常大的规模,问题的唯一部分似乎变得难看,就是每个尚未选择的节点都有成本,您需要在每一步找到成本最低的节点,但执行每一步都会减少一些随机节点的成本

    当您想要跟踪最低成本时,优先级队列是完美的。它可以有效地删除成本最低的节点(您在每个步骤中都会这样做)。它可以有效地添加几个新可访问的节点,就像您在任何步骤中所做的那样。但在基本设计中,它无法降低一些已经可以高成本访问的节点的成本

    因此(经常需要更具功能性的优先级队列),我通常创建一堆指向对象的指针,并且在每个对象中都有其堆位置的索引。heap方法都对对象进行回调,以便在其索引更改时通知它。堆还有一些外部方法调用,这些方法通常只能是内部的,例如,当现有元素的成本降低时,非常适合有效地修复堆

    我刚刚查看了std one的文档

    要查看我一直想添加的特性是否有一些形式,我以前没有注意到(或者在最近的C++版本中添加了)。据我所知,没有。大多数实际使用的优先级队列(当然是我所有的)都需要一些额外的小功能,我不知道如何在标准版本中添加这些功能。所以我需要从头重写它,包括额外的功能。但这其实并不难

    我使用的方法已经被很多人重新发明了(我在70年代用C语言做这件事,并不是第一次)。在谷歌的快速搜索中,我发现了许多地方,其中一个地方对我的方法的描述比我之前描述的更为详细。

    对不起,我看不出这是如何回答我的问题的……数据结构中的50K元素对于计算机来说是微不足道的。你在担心一个无关紧要的细节。@ManolisGrifoman我不明白为什么你需要所描述的数据结构的一半。为什么以及如何在哈希表中表示图形。。。这就是我发布链接的原因,因为Prims algo比你想做的要简单。在一些大于50K的尺寸下,原始解决方案的N平方方面会变得难看。然后您需要“优先级队列”的“智能修改”版本。据我所知,优先级队列的
    std
    版本不支持您需要的修改操作。编写一个更好的优先级队列并不难,但对于50K个元素来说并不值得。谢谢,我会尝试一下。