我有一个(非定向)图表使用邻接列表表示,例如
a: b, c, e
b: a, d
c: a, d
d: b, c
e: a
其中图表的每个节点都链接到其他节点的列表
我希望在给定某些节点的一些新列表的情况下更新这样的图表,例如
a: b, c, d
其中a
不再与e
相关联,并且已连接到新节点d
对图表执行此类更新的有效(时间和空间)算法是什么?
答案 0 :(得分:1)
也许我错过了一些东西,但使用节点标签(字符串或数字)的字典(或默认字典)来设置是不是最快?在这种情况下,更新可能如下所示:
def update(graph, node, edges, undirected=True):
# graph: dict(str->set(str)), node: str, edges: set(str), undirected: bool
if undirected:
for e in graph[node]:
graph[e].remove(node)
for e in edges:
graph[e].add(node)
graph[node] = edges
使用集合和dicts,向/从其他节点的边集添加和删除节点应该是O(1),与更新节点本身的边集相同,所以这应该只是O( 2n)对于两个循环,其中n是节点的平均边数。
答案 1 :(得分:0)
使用邻接网格会使O(n)更新,但无论图表有多稀疏,都会占用n ^ 2个空间。 (通过反转行和列来更新每个已更改的关系,从而轻而易举地完成。)
使用列表会将时间增加到O(n ^ 2)进行更新,但对于稀疏图形不会占用大量时间,并且可以节省大量空间。
答案 2 :(得分:0)
典型的更新是del edge a,e; add edge a,d
,但您的更新看起来像顶点a
的新邻接列表。所以只需找到a
邻接列表并替换它。那应该是O(log n)时间(假设排序的邻接列表数组,就像你的描述一样)。