首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将外邻接表转换为内邻接表?

如何将外邻接表转换为内邻接表?
EN

Stack Overflow用户
提问于 2017-04-09 12:20:20
回答 1查看 535关注 0票数 1

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2017-04-09 12:53:12

您可以在O(V + E)中执行此操作,但为此,您必须将链表中的insert操作修改为在固定时间的O(1)中完成。

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

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

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

代码语言:javascript
复制
insert 0 in linked list adj_new[x]

我们对每个链表执行上述操作。因为遍历整个邻接列表需要时间

O(V + E),每次插入操作占用O(1)时间,总耗时为O(V + E)

伪代码如下:

代码语言:javascript
复制
For each linked list A[i]
{
 for each element x of A[i]
 {
  append i to linked list adj_new[x]
 }
}

adj_new[]是邻接列表。如果你仔细观察,它只是颠倒了你有向图的每一条边的方向。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43302993

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档