代码之家  ›  专栏  ›  技术社区  ›  Mizipzor

在加权图中求边

  •  2
  • Mizipzor  · 技术社区  · 15 年前

    我有一个有四个节点的图,每个节点代表一个位置,它们被布置成二维网格。每个节点都有一个连接(边)到所有(根据位置)相邻节点。每边都有重量。

    以下是由a、b、c、d表示的节点,边缘的重量由数字表示:

    A     100     B
    
    120         220
    
    C     150     D
    

    我想构造一个容器和一个算法,它可以切换共享最大权重边缘的节点。然后重置该边的权重。每次执行算法时,节点(位置)都不能切换一次以上。

    例如,处理上面的内容时,最大的权重在edge bd上,所以我们切换它们。由于没有节点可以多次切换,因此B或D中涉及的所有边都将被重置。

    A             D
    
    120         
    
    C             B
    

    然后,下一个最大的重量是在唯一的左边,切换这些将给我们最终的布局:C,D,A,B。

    我目前正在运行一个非常糟糕的实现。我存储了一个很长的边列表,其中包含它们(可能)连接到的节点的四个值、其权重值和节点本身的位置。每次有任何请求时,我都会循环查看整个列表。

    我是用C++写的,STL的某些部分有助于加快速度吗?另外,如何避免重复数据?节点位置当前位于五个对象中。存在的节点本身以及四个节点,指示与它的连接。

    简言之,我需要以下方面的帮助:

    • 这样的结构是否可以避免重复数据?
    • 认识到问题了吗?如果其中任何一个有名字,告诉我,这样我就可以在谷歌上搜索更多关于这个主题的信息。
    • 快速算法总是很好的。
    2 回复  |  直到 15 年前
        1
  •  2
  •   Chad Wellington    15 年前

    至于名称,这是一个顶点覆盖问题。最佳顶点覆盖是NP难与体面的近似解决方案,但您的问题更简单。在更严格的边缘选择标准下,您将看到一个伪最大值。具体来说,一旦选择了一条边,每个连接的边都会被删除(表示要交换的顶点的删除)。

    例如,这里有一个标准的贪婪方法:

    0)对边缘进行排序;保留相邻信息
    边保持不变时:
    1)选择最高边缘
    2)从列表中删除所有相邻边
    循环结束

    选择的边列表提供要交换的顶点。
    时间复杂度为o(排序顶点+线性通过顶点),通常会归结为o(排序顶点),这可能是o(v*log(v))。

    保留邻接信息的方法取决于图形属性;请参阅友好的本地算法文本。为了简单起见,可以从邻接矩阵开始。

    与邻接信息一样,大多数其他的速度改进将最好地应用于特定形状的图形,但同时兼顾时间与空间的复杂性。

    例如,您的问题语句似乎暗示了顶点是以方形模式布局的,从中我们可以得到许多有趣的属性。例如,该系统很容易并行化。此外,邻接信息将是高度规则的,但在大的图形尺寸上是稀疏的(大多数顶点不会相互连接)。这使得邻接矩阵具有较高的开销;您可以将邻接矩阵存储在4元组数组中,因为这样可以保持快速访问,但几乎完全消除开销。

        2
  •  0
  •   Janusz Daniel Rindt    15 年前

    如果你有更大的图表,看看 boost graph 图书馆。它为图提供了良好的数据结构,并为不同类型的图遍历提供了基本迭代器。