【发布时间】:2015-04-20 03:52:25
【问题描述】:
我在 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? (即,我是否可以总是使用顶点在 vs 数组中的位置来在add_edge()等函数中引用该顶点?) - 我是否总是保证当我向图中添加一个新顶点时,它的索引将是
len(g.vs)-1?
编辑:关于边缘的相同问题:我保证我会在g.es[len(g.es)-1] 中找到最后添加的边缘吗?
【问题讨论】: