重新索引网络(图表)边缘列表

时间:2017-02-25 19:18:39

标签: indexing graph graph-algorithm networkx pseudocode

我的问题与语言无关,因此伪代码答案会更好。

让'假设我们有一个表示图形的边缘列表,这个边缘列表是经典的二维矩阵形式。我们还假设在这个边缘列表中,节点不是以连续的方式进行计算:在得到的adj矩阵中,将有几个原始数据和满为零的列。 这种情况的一个例子如下:

  • node1 node2
  • 20 21
  • 17 105
  • 105 108
  • 105 110
  • 45 105
  • 20 21

我们希望节点标签从1开始并结束到N =节点数。我们还希望保留每个节点之间的顺序关系:前一个标签中的节点和索引i

  • node1 node2
  • 2 3
  • 1 5
  • 5 6
  • 5 7
  • 4 5
  • 2 3

据我所知,这个任务可以通过两种方式实现:直接操作边缘列表或首先创建(稀疏)adj矩阵,然后直接删除全部为零的raws / columns(当然后一个动作)必须小心谨慎,因为直接删除完整的零行和列不会带来想要的结果:平凡的例子,在图中只有一个自循环的删除过程后会产生的平凡矩阵[0 1 0 0])。

我希望我已经清楚地说明了这个问题。

干杯

2 个答案:

答案 0 :(得分:1)

我只需获取所有标签,对它们进行排序并使用此排序列表将每个标签映射到int

// Part 1 : Get all the labels and order them
S = Set<int>
for edge E in edge-list
    S.insert(E.begin) // This is just getting the node1 
    S.insert(E.end)   // and node2
L = List<int>
L.insert(S) // Just put everything that was in S in a list
sort(L)
// In your example, you would have L = [17,20,21,45,105,...]


// Part 2 : Create a renaming of the labels
M = map<int,int>
for(int i = 0; i<L.length(); ++i)
    M[L[i]] = i

// You have your renaming. Each label has now an integer mapped to it
// It has all the properties you asked

请注意,我的新标签是0索引的,如果您想要与您提供的示例相同,只需执行M[L[i]] = i+1

现在每次遇到标签时,例如45,您都可以致电M[45]获取新标签

答案 1 :(得分:0)

如果您将图形作为networkx对象,则可以使用networkx relabel nodes function

将图形的节点重新索引到integer标签
import networkx as nx
old_graph = nx.Graph()
reindexed_graph = nx.relabel.convert_node_labels_to_integers(old_graph, first_label=0, ordering='default') #first_label is the starting integer label, in this case zero