对于有向图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 |)时间运行。
答案 0 :(得分:0)
您可以在 O(V + E)中执行此操作,但为此您必须修改链接列表中的插入操作以在恒定时间内完成 O(1)
通过保持单独的指针last
可以轻松完成,其中last
指向插入链接列表中的最后一个元素。在last
的帮助下,链接列表中的插入操作可以在 O(1)中完成,而不是通常的 O(N)。
现在遇到问题,我们说新的adjacency list
是adj_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[]
是邻接列表。如果仔细观察它只是反转有向图的每个边缘的方向。