如何将out-adjacency列表转换为in-adajcency列表?

时间:2017-04-09 04:20:20

标签: graph-algorithm pseudocode adjacency-list

对于有向图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|)算法的伪代码,该算法将out-adjacency list表示转换为in-adjacency list表示。请解释为什么你的算法是正确的以及为什么它在O(| V | + | E |)时间运行。

1 个答案:

答案 0 :(得分:0)

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

通过保持单独的指针last可以轻松完成,其中last指向插入链接列表中的最后一个元素。在last的帮助下,链接列表中的插入操作可以在 O(1)中完成,而不是通常的 O(N)

现在遇到问题,我们说新的adjacency listadj_new。我们首先从第一个链接列表开始遍历原始的adjacency list

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

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[]是邻接列表。如果仔细观察它只是反转有向图的每个边缘的方向。