Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 计算节点度的图算法_Algorithm_Graph - Fatal编程技术网

Algorithm 计算节点度的图算法

Algorithm 计算节点度的图算法,algorithm,graph,Algorithm,Graph,我正在尝试实现DAG的拓扑排序算法。() 这个简单算法的第一步是找到零度的节点,如果没有二次算法,我无法找到任何方法 我的图形实现是一个简单的邻接列表,基本过程是循环遍历每个节点,每个节点遍历每个邻接列表,因此复杂性将是O(|V |*| V |) 拓扑排序的复杂性是O(| V |+| E |),因此我认为必须有一种方法以线性方式计算所有节点的度。您可以在从图中删除节点的同时保持所有顶点的索引,并保持零索引节点的链接列表: indeg[x] = indegree of node x (compu

我正在尝试实现DAG的拓扑排序算法。() 这个简单算法的第一步是找到零度的节点,如果没有二次算法,我无法找到任何方法

我的图形实现是一个简单的邻接列表,基本过程是循环遍历每个节点,每个节点遍历每个邻接列表,因此复杂性将是
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
  • 现在遍历给定的邻接列表,对于图g中的
    边(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:Initialize
    indeg[x]=0
    for all
    x
    。对于每个边
    (v,w)
    ,在从用户获取输入时,可以很容易地找到增量
    indeg[w]
    。这很可能是一个循环,因此是线性的。