Algorithm 由有向图计算线有向图的一种有效算法

Algorithm 由有向图计算线有向图的一种有效算法,algorithm,graph-theory,linegraph,Algorithm,Graph Theory,Linegraph,有人知道从有向图计算线有向图的有效算法吗?请参阅(维基百科的文章在底部提到有向图的情况(在概括部分)。理想情况下,我希望在线性时间内这样做 从该部分: 如果G是有向图,则其有向线图或线有向图的每条边都有一个顶点 当v=w时,表示G中从u到v和从w到x的有向边的两个顶点由线有向图中从uv到wx的边连接 设G为有向图 设L(G)为有向线图 在给定G的情况下,我能想到的生成L(G)的算法是: 迭代G的所有边以生成L(G)的节点 迭代L(G)中的所有节点对(uv,wx),如果v=w,则连接 这是

有人知道从有向图计算线有向图的有效算法吗?请参阅(维基百科的文章在底部提到有向图的情况(在概括部分)。理想情况下,我希望在线性时间内这样做

从该部分:

  • 如果G是有向图,则其有向线图或线有向图的每条边都有一个顶点
  • 当v=w时,表示G中从u到v和从w到x的有向边的两个顶点由线有向图中从uv到wx的边连接
设G为有向图 设L(G)为有向线图

在给定G的情况下,我能想到的生成L(G)的算法是:

  • 迭代G的所有边以生成L(G)的节点
  • 迭代L(G)中的所有节点对(uv,wx),如果v=w,则连接
这是一个O(n^2)算法


似乎应该有一种方法可以把时间缩短到O(n)时间。我要去考虑一下,但我想我会问一下堆栈溢出问题,以防有一些著名的(或不那么著名的)做这件事的算法我不知道。

嗯……我想经过一些思考后,可能会有一个更省时的算法……但这需要相当多的簿记和一大块额外的内存来完成

我的基本想法是循环G中的所有节点,并从连接到每个节点的边创建连接的节点。通过一个额外的链接来跟踪G(边)到L(G)(节点),您可能只需要通过G上的节点执行一个循环就可以了。

您不能从O(n^2)开始执行,因为有些图是线性图,边的基数等于原始图顶点的基数的平方:例如,在一个有n+1个顶点的图上,一个顶点连接到其他所有顶点:然后你必须用n个顶点建立一个团,所以有(n-1)^2条边

一个算法的复杂度是由它产生的输出的大小从底部限定的

当然,这并不意味着我们不需要找到智能算法。我想:

LG(LN,LE) getLinearGraph(G(N,E)) {
  LN = EmptySet();
  LE = EmptySet();
  for (Vertex v : N) {
    verticesToAdd = EmptySet()
    for (Vertex i : out-degree(v) {
      toAdd += textual-rep((v,i));
    }
    LN += toAdd;
    LE += make-clique(toAdd);
  }
}

我猜最好的方法是改变第二步“遍历L(G)中的所有节点对(uv,wc)”,这样它就可以“遍历G中的所有节点v”。然后对于每个传入边uv和传出边vx,L(G)中将有一条边(在节点uv和vx之间)。尽管这听起来仍然像是一个O(n^2)算法。也许有一些摊销分析?我不太确定我是否理解你的例子。你是说G是这样的:www.cs.colontate.edu/~stonea/stkimg/G.png(我不知道如何将图像嵌入到评论中)。在这种情况下,线图将只是节点{ab,ac,ad,…},没有边。尽管我怀疑你是对的,在L(G)中可能存在边的二次爆破。我能想到L(G)比G(比如维基百科文章中的G)有更多边的情况。线图是有方向的,但原始的不是,所以是的,如果你把这些边计算为无方向的,你有我的例子。你可以看到我所说的维基百科例子:3与1和4相连,在直线图中,我们有一个包含节点(1,3),(1,4),(3,4)的嵌入团。哦,好的,我明白了。没错,你会得到一个小团体:www.cs.coloutate.edu/~stonea/stkimg/g2.png