Algorithm 计算节点度的图算法
我正在尝试实现DAG的拓扑排序算法。() 这个简单算法的第一步是找到零度的节点,如果没有二次算法,我无法找到任何方法 我的图形实现是一个简单的邻接列表,基本过程是循环遍历每个节点,每个节点遍历每个邻接列表,因此复杂性将是Algorithm 计算节点度的图算法,algorithm,graph,Algorithm,Graph,我正在尝试实现DAG的拓扑排序算法。() 这个简单算法的第一步是找到零度的节点,如果没有二次算法,我无法找到任何方法 我的图形实现是一个简单的邻接列表,基本过程是循环遍历每个节点,每个节点遍历每个邻接列表,因此复杂性将是O(|V |*| V |) 拓扑排序的复杂性是O(| V |+| E |),因此我认为必须有一种方法以线性方式计算所有节点的度。您可以在从图中删除节点的同时保持所有顶点的索引,并保持零索引节点的链接列表: indeg[x] = indegree of node x (compu
O(|V |*| V |)
拓扑排序的复杂性是
O(| V |+| E |)
,因此我认为必须有一种方法以线性方式计算所有节点的度。您可以在从图中删除节点的同时保持所有顶点的索引,并保持零索引节点的链接列表:
indeg[x] = indegree of node x (compute this by going through the adjacency lists)
zero = [ x in nodes | indeg[x] = 0 ]
result = []
while zero != []:
x = zero.pop()
result.push(x)
for y in adj(x):
indeg[y]--
if indeg[y] = 0:
zero.push(y)
也就是说,使用DFS进行拓扑排序在概念上要简单得多,IMHO:
result = []
visited = {}
dfs(x):
if x in visited: return
visited.insert(x)
for y in adj(x):
dfs(y)
result.push(x)
for x in V: dfs(x)
reverse(result)
您还可以使用DFS进行拓扑排序。处理每个节点后,不需要额外的过程来计算度数
您可以在
o(|v|+e|)中实现它。
。遵循以下给定步骤:
inDegree
,outDegree
,用于维护每个节点的进出边计数,并将其初始化为0边(u,v)
,增加u的outdegree的计数,增加v的indegree的计数
o(v+e)
中的邻接列表,并对o(|v|+|e |)中的每个u具有独立度和独立度李>
您提到的访问邻接节点的复杂性并不完全正确(O(n2)),因为如果仔细考虑,您会注意到这更像是BFS搜索。因此,每个节点和每条边只访问一次。因此,复杂度为O(m+n)。其中,n是节点数,m是边数 我想他是在问如何在你的代码中快速计算indeg()。@林伟:哦,现在我明白你的评论是什么意思了<代码>索引(y)
是一个变量,而不是一个函数。它已经有了正确的值,我们只需要读取它。现在我明白了,我想说得更清楚一点。只是在我读了OP的问题之后,我现在也很好奇,你最初是如何在线性时间内获得每个节点的所有索引的?@Linwei:Initializeindeg[x]=0
for allx
。对于每个边(v,w)
,在从用户获取输入时,可以很容易地找到增量indeg[w]
。这很可能是一个循环,因此是线性的。