【问题标题】:How to transform out-adjacency list to in-adajcency list?如何将 out-adjacency 列表转换为 in-adajcency 列表?
【发布时间】:2017-04-09 04:20:20
【问题描述】:

对于有向图 G = (V,E)。该表示维护一个由 V 索引的数组 A[...] ,其中 A[v] 是一个链表。链表包含 v 指向的所有节点 u 的名称,即 (v, u) ∈ E 的节点 u。(从技术上讲,A[v] 包含指向链表中第一项的指针)。这是默认的邻接列表格式,可以认为是out- adjacency 列表表示

in-adjacency 列表表示将是其中 A[v] 是指向 v 的节点列表。

谁能帮我提供一个O(|V | + |E|) 算法的伪代码,该算法将外邻接表表示转换为内邻接表表示。请解释为什么你的算法是正确的以及为什么它在 O(|V | + |E|) 时间内运行。

【问题讨论】:

    标签: graph-algorithm pseudocode adjacency-list


    【解决方案1】:

    您可以在 O(V + E) 中执行此操作,但为此您必须修改链表中的插入操作以在恒定时间内完成 O(1).

    这很容易做到,只需保留一个单独的指针last,其中last 指向插入到链表中的最后一个元素。在last的帮助下,链表中的插入操作可以在O(1)中完成,而不是通常的O(N)

    现在问题来了,假设我们的新adjacency listadj_new。我们首先从第一个链表开始遍历我们原来的adjacency list

    对于链表A[0]的每个元素x,我们进行插入操作:

    insert 0 in linked list adj_new[x]
    

    我们对每个链表执行上述操作。由于遍历整个邻接表需要时间
    O(V + E),而且每次插入操作需要O(1)时间,所以总耗时 >O(V + E)

    以下是伪代码:

    For each linked list A[i]
    {
     for each element x of A[i]
     {
      append i to linked list adj_new[x]
     }
    }
    

    adj_new[] 是邻接列表。如果你仔细看,它只不过是反转有向图每条边的方向。

    【讨论】:

    • 对不起,我对你的解释还不是很清楚,你能详细解释一下吗
    • @ttllm 你有什么不明白的?
    猜你喜欢
    • 2017-01-21
    • 2016-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2021-05-26
    • 2016-12-16
    • 1970-01-01
    相关资源
    最近更新 更多