相当满口的冠军,但这里有。我面临的问题是从输入流中读取一堆无向边和一些顶点并输出一组边。我输出的边缘集合不能有任何“空白” - 我的意思是我不能将(1,2),(2,4)和(4,5)的边集设置为在顶点集中永远不会提到顶点#3。
不允许使用此图表,因为2将是“空白”
允许使用此图表,因为连接图中没有“空白”。有4个顶点,它们编号为1到4。此图的输出为[[1,3] [3,4] [4,2] [2,1]]
我现在的情况如下:
当我知道有多少个顶点时,我将它们的所有索引添加到包含所有孤立顶点的HashSet中。 当我从输入流中读取边时,我从HashSet中删除每个边的顶点。 之后,我将它们添加到尺寸为(| V |,2)的2D阵列中。 如果在我占据所有边缘之后有任何孤立的顶点,我会调用我的“reorder-method”。
它的作用如下;
在伪中,这是(程序本身是用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)
有什么方法可以让我以某种方式提高效率吗?
答案 0 :(得分: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