【问题标题】:Graph algorithm to calculate node degree图算法计算节点度
【发布时间】:2014-04-09 12:31:04
【问题描述】:

我正在尝试为 DAG 实现拓扑排序算法。 (http://en.wikipedia.org/wiki/Topological_sorting) 这个简单算法的第一步是找到零度的节点,如果没有二次算法,我找不到任何方法。

我的图实现是一个简单的邻接列表,基本过程是遍历每个节点,并且每个节点都遍历每个邻接列表,因此复杂度将是O(|V| * |V|)

拓扑排序的复杂度是O(|V| + |E|),所以我认为必须有一种方法可以以线性方式计算所有节点的度数。

【问题讨论】:

    标签: algorithm graph


    【解决方案1】:

    您可以在从图中删除节点的同时维护所有顶点的入度,并维护一个零入度节点的链表:

    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 的拓扑排序在概念上要简单得多,恕我直言:

    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)
    

    【讨论】:

    • 我想他是在问如何在你的代码中快速计算 indeg()。
    • @linwei:哦,现在我明白你的评论是什么意思了。 indeg(y) 是一个变量,而不是一个函数。它已经有了正确的值,我们只需要读取它。我现在试图让它更清楚一点
    • 我明白这一点。只是在我读了 OP 的问题之后,我现在也很好奇,你最初是如何在线性时间内获得每个节点的所有 indeg 的?
    • @Linwei:为所有x初始化indeg[x] = 0。对于每条边(v,w),递增indeg[w]
    • 在接受用户输入时可以很容易地找到 indeg 。这很可能是一个循环,因此是线性的。
    【解决方案2】:

    您可以在o(|v|+|e|) 中实现它。请按照以下给定步骤:

    1. 创建两个列表inDegreeoutDegree,维护每个节点的进出边计数,将其初始化为 0。
    2. 现在遍历给定的邻接列表,对于图 g 中的 edge (u,v),增加 u 的 outdegree 计数,增加 v 的 indegree 计数。
    3. 您可以遍历o(v +e) 中的邻接列表,并为o(|v|+|e|) 中的每个u 提供入度和出度。

    【讨论】:

      【解决方案3】:

      您提到的访问邻接节点的复杂度并不完全正确(O(n2)),因为如果您仔细考虑,您会注意到这是更像是 BFS 搜索。因此,您只访问每个节点和每个边一次。因此,复杂度为O(m+n)。其中,n 是节点数,m 是边数。

      【讨论】:

        【解决方案4】:

        您还可以使用 DFS 进行拓扑排序。处理每个节点后,您不需要额外的传递来计算入度。

        http://www.geeksforgeeks.org/topological-sorting/

        【讨论】:

          猜你喜欢
          • 2021-08-24
          • 1970-01-01
          • 2014-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-04
          • 1970-01-01
          • 2021-01-02
          相关资源
          最近更新 更多