是否有更快的算法来构建此图的邻接列表?

时间:2017-06-29 15:52:40

标签: java algorithm graph complexity-theory

我的问题是找到一个更好的算法来填充邻接列表。

规格:

G = (V , E ) //the graph
V ={w} //vertex in this case each vertex is an array     
E={⟨u,v⟩| u,v ∈V ∧ u>v} // edge only if u > v
u > v only if  foreach i u̸=v ∧ u[i]≥v[i]. // (u>v and v>w => u>w)

我的天真代码白色复杂度 O((v + 1)* v / 2)≈O(n ^ 2)

private void riempiAdj() {
    for(int i=0;i<nodi.length;i++)
        for(int j=i+1;j<nodi.length;j++)
            if(nodi[i].eMaggiore(nodi[j]))
                nodi[i].adj.inserisci(nodi[j]);     
}

nodi是顶点数组

adj是邻接列表

AdjList.inserisci(Vertex t)将一个顶点t添加到邻接列表中 O(1)

Vertex.eMaggiore(Vertex t)在此&gt;中返回true t O(1)

存在 O(v) O(v * log()v)的算法复杂性?

1 个答案:

答案 0 :(得分:1)

在最坏的情况下,您尝试构建的图形中包含Θ(| V | 2 )边(边的总数为0 + 1 + 2 + ... + | V | -1 = | V |(| V | - 1)/ 2),因此任何为图形显式构建邻接列表的算法都必须做Ω(| V | 2 )在最坏的情况下工作只是因为需要添加许多边缘。

由于这里的边缘有一个很好的模式,你可以想象创建某种懒惰评估的邻接列表,只在需要时创建边缘,尽管这是一个单独的问题。