有没有人知道从有向图计算线图的有效算法?请参阅http://en.wikipedia.org/wiki/Line_graph(维基百科文章提到底部附近的有向图案例(在“推广”部分中)。理想情况下,我想在线性时间内完成此操作。
从该部分开始:
设G是有向图 设L(G)为有向线图
我给出的算法可以产生给定G的L(G):
这是一个O(n ^ 2)算法。
似乎应该有一种方法可以将其降低到O(n)时间。我要考虑这个,但我想我会问堆栈溢出,以防万一有一些我不知道的着名(或不那么着名)的算法。
答案 0 :(得分:1)
嗯......我认为在经过一些考虑之后可能会有一个更节省时间的算法...但是这需要相当数量的簿记和一大块额外的内存来实现。
我的基本想法是,您遍历G中的所有节点,并从连接到每个节点的边创建连接的节点。通过额外的链接来跟踪G(边缘)到L(G)(节点),您可以通过G上的节点只通过一个循环逃脱。
答案 1 :(得分:1)
你不能从O(n ^ 2)开始,因为有一些带有线性图的图形,其边缘的基数等于原始顶点的基数的平方:想想,对于例如,在具有n + 1个顶点的图形中,单个顶点连接到其他所有顶点:然后您需要构建一个包含n个顶点的clique,因此使用(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);
}
}