【问题标题】:Memory conservative maximal independent set of vertices记忆保守的最大独立顶点集
【发布时间】:2012-05-30 07:38:06
【问题描述】:

我想为无向图中的最大独立顶点集找到一种内存保守但高效的算法。

传统算法使用辅助数据结构(原始图的副本)来实现它。我想避免这种并行结构,因为内存分配对于实时实现来说很慢,而且我有一些内存边界。 我只想用布尔标签标记 MIS 中的节点。 有可能吗?

请注意,我不希望 ma​​ximum 独立,而是 ma​​ximal 独立集。

附: 我知道这个问题与语言无关,但我使用 C++ 和 STL 进行编码。

【问题讨论】:

  • 经过一些研究,我发现了一个非常简单的 MIS 算法版本,但它再次使用了辅助数据结构(一组访问节点)。使用 std::set 将其实现为 RB 树可能会有所帮助。为了计算内存中图 G = (V, E) 的最大独立集 S,可以使用以下简单算法: 以任意顺序处理顶点。当访问一个顶点 v ∈ V 时,如果它的邻居都不在 S 中,则将其添加到 S。算法归功于 Karp,1985 年

标签: c++ algorithm graph graph-theory stl-algorithm


【解决方案1】:

如果每个节点 i 只有布尔标签 (i),这是一个解决方案。它需要时间 O(|V|+|E|),其中 |V|是节点数,|E|是输入图中的边数。

For all nodes v
   set label(v)=false;
For all nodes v
   if (all neighbors w of v have label(w)=false)
      set label(v)=true

label(v)=true 的节点 v 是一个最大独立集。它们是独立的,因为根据构造,任何带标签的节点 v 都不能有带标签的邻居。它们是一个最大集,因为您只是激活标签,并且只有在另一个已标记的邻居 w 阻止节点 v 时才留下未标记的节点。

优化说明:如果节点编号为 1...n,则只需要检查邻居 w=1..v-1,因为任何其他 w 都不能有 label(w)=true。

【讨论】:

    【解决方案2】:

    如果不确切知道您的数据结构是什么,就很难回答这类问题。近就地图形操作的常用技巧是从指针中窃取两个原本为零的位并对图形结构进行可逆更改,但我不确定它们如何应用在这里。

    从阅读您所写的内容来看,似乎没有遍历的情况下无法遍历图中的节点。你如何表示堆栈,例如 DFS?

    【讨论】:

      【解决方案3】:

      我使用划痕vectordeque<bool> 来指示元素、边或面使用了哪些顶点...

      std::deque<bool> used(vertex.size(), false);
      for (size_t e = 0; e < edge.size(); ++e)
      {
          used[edge[e].v1] = true;
          used[edge[e].v2] = true;
      }
      

      Now used == true 表示所有已使用的顶点。如果你愿意,其他的可以折叠起来。

      【讨论】:

        猜你喜欢
        • 2012-01-25
        • 1970-01-01
        • 2021-03-13
        • 2012-09-27
        • 1970-01-01
        • 2013-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多