【问题标题】:Space efficient minimum spanning tree节省空间的最小生成树
【发布时间】:2018-11-21 03:04:24
【问题描述】:

我遇到了一个任务,基本上要求您找到所有顶点都连接的给定图形的 MST。我尝试使用 Kruskal 的算法,但我很快发现空间限制太小,无法以兆字节存储所有边缘,所以我也放弃了 Prim 和 Boruvka 的算法。有没有办法实现这些算法(或任何其他 MST 算法),其空间复杂度优于 O(E),在这种情况下为 O(V^2)?

【问题讨论】:

  • 如果不存储所有边,你怎么知道每条边的重量
  • 不知道,这就是为什么我要问是否有办法这样做,或者是否有其他方法可以找到 MST。
  • 也许发布您的代码以找到空间优化
  • 我相信@juvian 有道理。我相信任务的空间需求不包括图表的存储成本。 (即邻接列表)如果没有,则无法将给定的图形表示为输入。如果我是正确的,并且问题不包括存储邻接列表的成本,那么 Prim 的算法可以为您解决问题,只要您在每个顶点的优先级队列中存储一个元素。 (即,如果您使用集合而不是优先级队列)如果您确实在 Prim 算法中使用了集合,那么该集合最多包含 O(V) 个元素。
  • 朱维安是对的。你不能在不知道权重的情况下构建 MST,这不可避免地会花费 O(V²) 空间。但也许在你的情况下,权重可以计算而不是存储?

标签: algorithm minimum-spanning-tree space-complexity kruskals-algorithm prims-algorithm


【解决方案1】:

对于您可以使用函数 w(i,j) 计算权重的情况,您可以使用 Prim 算法 (https://en.wikipedia.org/wiki/Minimum_spanning_tree#Classic_algorithms) 计算空间 O(n) 而不是 O(n^2) 中的最小生成树.

在每个阶段维护树中节点的集合T,并且对于不在树中的每个节点保持从该节点到树中任何节点的最小距离。

在开始时,T 是节点 0,对于每个其他节点,您计算从节点 0 到该节点的最小距离。

在每个阶段选择距离最小的不在树中的节点。现在计算从该节点到不在树中的所有其他节点的距离。如果这小于他们当前的最小距离,则更新该最小距离。

存储成本是 O(n) 来维护 T 和 O(n) 来维护不在树中的每个节点从树到该节点的最小距离的注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-13
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多