【问题标题】:Is there a faster algorithm for constructing the adjacency list of this graph?有没有更快的算法来构建这个图的邻接表?
【发布时间】:2017-06-29 15:52:40
【问题描述】:

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

规格:

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) 在此 > t O(1)

中返回 true

是否存在复杂度为 O(v)O(v*log()v) 的算法?

【问题讨论】:

    标签: java algorithm graph complexity-theory


    【解决方案1】:

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

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

    【讨论】:

    • 我认为 Θ(|V|2) 边缘不正确,因为数组中的 **evrey 元素 ** 必须大于或等于另一个数组的相同索引元素,因此对于 ezample 如果我有 n 个数组:a1:1,0,0,0,0...,0 a2:0,1,0,0,0...,0 a3:0,0,1,0,0.. .,0 an:,0,0,0,0...,1 我有 0 条边
    • 答案是正确的,最坏的情况是每个节点都相互连接。
    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多