【问题标题】:Efficient way to eliminate isolated vertices and reorder the vertices of resulting graph消除孤立顶点并重新排序结果图顶点的有效方法
【发布时间】:2017-03-15 17:43:23
【问题描述】:

对于一个标题来说,这是一个很大的问题,但在这里。我面临着从输入流中读取一堆无向边和一些顶点并输出一组边的问题。我输出的边集不能有任何“空白” - 我的意思是我不能有 (1,2)、(2, 4) 和 (4, 5) 的边集顶点#3 永远不会在顶点集中被提及。

不允许使用此图,因为 2 将是“空白”

此图是允许的,因为连通图中没有“空白”。有 4 个顶点,编号从 1 到 4。 此图的输出将是 [[1, 3][3, 4][4, 2][2, 1]]

到目前为止,我的处理方式如下:

当我知道有多少个顶点时,我将它们的所有索引添加到包含所有孤立顶点的 HashSet 中。 当我从输入流中读取边时,我从 HashSet 中删除了每条边的两个顶点。 之后,我将它们添加到具有维度 (|V|, 2) 的二维数组中。 如果在我接受所有边之后有任何孤立的顶点,我会调用我的“重新排序方法”。

它的作用如下;

  • 以二维矩阵和孤立顶点集作为输入
  • 调用我的帮助方法 findMatrixProperties(),它通过嵌套循环一次遍历整个矩阵一个元素来查找矩阵的最大值以及不同顶点的数量。
  • 然后我使用 (while matrixMax > nrOfVertices) 进入我的 while 循环
  • 在我的 while 循环中,我遍历整个矩阵,用孤立的顶点将所有最大值替换为 HashSet 的最小值。
  • 在完成矩阵的完整迭代后,我删除了孤立顶点集中的最小值并再次调用 findMatrixProperties()。

伪this是(程序本身是用Java编写的)

reorderMethod(matrix M, isolated vertex set I) 
  matrixProperties = findMatrixProperties(M) // matrixProperties is an instance of a helper class MatrixProperty which holds two integers, max and nrOfVertices
  while (max > nrOfVertices) 
    for row in M
      for col in M 
        if M[col, row] = max:
          M[col, row] = min(I)
    // Remove min(I) from I 
    matrixProperties = findMatrixProperties(M)

有什么方法可以让这件事变得更有效率吗?

【问题讨论】:

  • 我很困惑为什么第二张图是被允许的 - 是不是有一个“空白”,因为从来没有提到过 5?
  • 另外,为什么你可以在第一个图中设置边 (1, 2),因为它不是图中的边?
  • 你能提供第二个允许图的输出吗?
  • 对于具有 5 个顶点和单个 [1, 2] 边的图,您将输出什么?
  • 所以我可以看到您只允许图形具有单个组件,其边的顶点索引是连续的并且从 1 开始,不是吗?

标签: java algorithm multidimensional-array graph-theory


【解决方案1】:

如果我正确理解了您的问题,您希望为图的顶点找到一个规范的重新编号,以便没有完全不连接的节点的标签比连接的节点更小。

简单的答案是使用具有较小标签的连接顶点的计数来标记每个顶点。 (这将从 0 而不是 1 开始对顶点进行编号,但您可以很容易地为每个标签添加一个。)

您似乎使用的是布尔 NxN 数组而不是邻接列表,所以这就是我编写以下伪代码的方式。不过,邻接列表的更改将是微不足道的。

我们首先通过在每一行上应用or 运算符将布尔数组简化为布尔向量。一个节点连接到某个东西,除非它的整行都是假的,所以布尔向量足以告诉我们一个节点是否连接。显然,当我们遇到第一个true 值时,我们可以在扫描一行时停止。然后,我们将布尔向量重新解释为 0 和 1 的整数向量,并执行非常类似于向量上的累积和的操作,这样向量将包含每个条目的具有较小标签的连通分量的数量,这意味着如果忽略未连接的顶点,则结果向量正是从旧标签到规范标签的转换。 (可以为所有顶点构建平移;下面的伪代码将通过从最后一个标签向下重新编号未连接的顶点来实现。)

我使用了类似 python 的伪代码,因为 Java 对我来说还不够伪 :)

# M is an adjacency matrix; we assume that it is square.
# The function returns the translation vector
def renumber(M):
  ones = 0
  zeros = len(M) - 1
  trans = []
  for row in M:
    if any(row):
      # the edge is connected
      trans.append(ones)
      ones += 1
    else:
      # the edge is unconnected
      zeros -= 1
      trans.append(zeros)
  return trans

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    • 2021-12-28
    相关资源
    最近更新 更多