我正在使用Python中的igraph库。我想知道是否有一种方法可以将字符串用作顶点索引。我知道关于'name'属性,我可以编写:
g = igraph.Graph(directed=True)
g.add_vertex('hello')
g.add_vertex('world')
g.add_edge('hello','world')
一切都正常工作。 但是如果我两次添加相同的顶点,例如:
g = igraph.Graph(directed=True)
g.add_vertex('world')
g.add_vertex('hello')
g.add_vertex('hello')
当我添加一条边时,将会创建两个不同的顶点:
g.add_edge('hello','world')
将边添加到第一个名称匹配“hello”的顶点。这也表明这种形式的索引具有O(n)复杂度,而不是O(1)(即扫描整个顶点列表,直到找到一个顶点v,使得v['name'] == 'hello'
)。
因此,我考虑保持顶点名称和索引之间的映射,例如:
mapping = {}
g = igraph.Graph(directed=True)
g.add_vertex('hello')
mapping['hello'] = len(g.vs)-1
g.add_vertex('world')
mapping['world'] = len(g.vs)-1
g.add_edge(mapping['hello'],mapping['world'])
我假设这个方案应该可行,因为我从不删除顶点,所以我猜顶点的索引应该保持不变。它还具有平均查找速度 O(1),这应该比以前的解决方案更好。 然而,我想知道:
- 我是否始终保证
g.vs[i].index == i
?(例如,我是否可以 始终 在诸如add_edge()
这样的函数中使用 vs 数组中顶点的位置来引用该顶点?) - 我是否始终保证当我向图中添加新顶点时,它的索引将会是
len(g.vs)-1
?
编辑:关于边缘的同样问题:我是否保证能够在 g.es[len(g.es)-1]
中找到最后添加的边缘?
g.vs [len(g.vs)-1]
这个事实,我该如何为最后添加的顶点设置属性或引用它以创建连接到它的边? - Simone Bronzini