【问题标题】:Prim’s MST for Adjacency List RepresentationPrim 用于邻接表表示的 MST
【发布时间】:2020-05-09 12:51:07
【问题描述】:

我试图使用 min Heap 来实现 Prim 的算法。 这是我所指的链接 https://www.geeksforgeeks.org/prims-mst-for-adjacency-list-representation-greedy-algo-6/

我想知道为什么我们可以使用向量并使用std::sort 函数代替最小堆对其进行排序。

【问题讨论】:

  • 请不要提供链接作为第一信息来源。相反,复制/粘贴相关部分(可能以> 为前缀以将它们标记为引用)并另外提供链接以供参考。

标签: c++ prims-algorithm min-heap


【解决方案1】:

您可以,但请记住,每次将新节点添加到 MST 时,您都必须更新跨分区的边集(边到尚未在 MST 中的节点),因此您必须进行排序您在算法的每次迭代中的向量,这会浪费时间,因为您只需要知道穿过分区的哪些边在该迭代中具有最小值,最小堆对于该操作是最佳的,因为它的时间复杂度为提取最小值是O(log n),而排序是O(n log n),这会使算法在大图或密集图上运行得更慢。

【讨论】:

  • 我们可以像最小堆一样使用具有相同时间复杂度的集合吗?
  • 当然,std::set 可以解决问题,唯一的细节是它不允许重复元素,所以如果图表有多个可能的 MST,你会得到始终是相同的,这取决于您在交叉边缘上迭代的顺序,但只有当您被明确要求获得特定 MST 或所有可能的 MST 时,这才可能是一个问题,否则您很好。跨度>
  • 只是别的,如果你在哪里使用std::set,你需要使用一个结构来保存边缘的权重和由它连接的节点的id,并定义一个比较比较项目的函数,一个std::map,边的权重作为键,节点的id不在MST中,这种方法更容易归档相同的结果,这就是我当时实现它的方式。
猜你喜欢
  • 2012-10-11
  • 2023-03-21
  • 1970-01-01
  • 2016-03-29
  • 2017-12-04
  • 1970-01-01
  • 2011-03-26
  • 2013-07-04
  • 1970-01-01
相关资源
最近更新 更多