设计PRIM算法的最有效数据结构是什么?

时间:2015-10-30 15:34:43

标签: c++ data-structures graph hashtable minimum-spanning-tree

我正在使用哈希表为其元素设计一个c ++图。哈希表使用开放寻址,图表边缘不超过50.000。我还设计了一个PRIM算法来查找图的最小生成树。我的PRIM算法为以下数据创建存储空间:

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

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

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

  • 名为A的表格。程序在此存储最小生成树的最终边缘。这是返回的表。

假设图表有50.000个边缘,那么用于创建这些表的最有效的数据结构是什么?

我可以使用数组吗?

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

但同样,这些元素对很多人来说都是如此。我的算法适用于由几个节点(10或20)组成的图形,但我对图形由40.000个节点组成的情况持怀疑态度。任何建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

(因为评论有点长):问题的唯一部分似乎是非常大的丑陋,是因为尚未选择的每个节点都有成本,你需要找到成本最低的那个节点每一步,但执行每一步都会降低一些有效随机节点的成本。

当您想要追踪最低成本时,优先级队列是完美的。它可以有效地删除成本最低的节点(您在每个步骤中执行此操作)。添加一些新可访问的节点非常有效,就像您在任何步骤中一样。但是在基本设计中,它无法降低已经以高成本获得的少数节点的成本。

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

我刚刚查看了标准文件的文档 http://en.cppreference.com/w/cpp/container/priority_queue
看看我总是想添加的功能是否以某种形式存在,我以前没有注意到(或者在最近的一些C ++版本中添加)。据我所知,。大多数现实世界中使用优先级队列(当然我的全部)需要一些额外的小功能,我不知道如何应对标准版本。所以我需要从头开始重写它,包括额外的功能。但这实际上并不难。

我使用的方法已被许多人重新设计(我在70年代在C中做过这个,而不是第一个)。一个快速的谷歌搜索发现我的方法中的一个比我描述的更详细。 http://users.encs.concordia.ca/~chvatal/notes/pq.html#heap