图分区后建立新的邻接矩阵

时间:2018-08-05 18:35:31

标签: graph adjacency-matrix metis

我有一个以CSR格式存储的邻接矩阵。例如

xadj = 0 2 5 8 11 13 16 20 24 28 31 33 36 39 42 44
adjncy = 1 5 0 2 6 1 3 7 2 4 8 3 9 0 6 10 1 5 7 11 2 6 8 12 3 7 9 13 4 8 14 5 11 6 10 12 7 11 13 8 12 14 9 13

我现在正在使用METIS对所述图进行分区。这给了我图的分区向量part。基本上是一个列表,告诉我每个顶点在哪个分区中。有没有一种有效的方法来为该分区构建新的邻接矩阵,以便我可以再次对新图进行分区?例如函数rebuildAdjacency(xadj, adjncy, part)。如果可能,请重用xadjadjncy

1 个答案:

答案 0 :(得分:1)

我假设“重建”的意思是删除已分配了不同分区的顶点之间的边?如果是这样,(可能)最好的办法是迭代CSR列表,生成一个新的CSR列表,并跳过分区之间的所有边缘。

使用伪代码(实际上或多或少是Python):

new_xadj = []
new_adjcy = []

for row in range(0, n):
  row_index = xadj[row]
  next_row_index = xadj[row+1]

  # New row index for the row we are currently building
  new_xadj.append(len(new_adjcy)) 

  for col in adjncy[row_index:next_row_index]:
    if partition[row] != partition[col]:
      pass # Not in the same partition
    else: 
      # Put the row->col edge into the new CSR list
      new_adjcy.append(col)

# Last entry in the row index field is the number of entries
new_xadj.append(len(new_adjcy))

我认为您不能非常有效地重用旧的xadjadjcy字段来完成此操作。但是,如果您递归执行此操作,则可以通过分别拥有xadjadjc的两个副本并在它们之间交替进行来节省内存分配/释放。