图更新算法

时间:2012-07-22 03:09:49

标签: python algorithm graph-theory graph-algorithm

我有一个(非定向)图表使用邻接列表表示,例如

a: b, c, e
b: a, d
c: a, d
d: b, c
e: a

其中图表的每个节点都链接到其他节点的列表

我希望在给定某些节点的一些新列表的情况下更新这样的图表,例如

a: b, c, d

其中a不再与e相关联,并且已连接到新节点d

对图表执行此类更新的有效(时间和空间)算法是什么?

3 个答案:

答案 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)时间(假设排序的邻接列表数组,就像你的描述一样)。