我的问题是找到一个更好的算法来填充邻接列表。
规格:
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)的算法复杂性?
答案 0 :(得分:1)
在最坏的情况下,您尝试构建的图形中包含Θ(| V | 2 )边(边的总数为0 + 1 + 2 + ... + | V | -1 = | V |(| V | - 1)/ 2),因此任何为图形显式构建邻接列表的算法都必须做Ω(| V | 2 )在最坏的情况下工作只是因为需要添加许多边缘。
由于这里的边缘有一个很好的模式,你可以想象创建某种懒惰评估的邻接列表,只在需要时创建边缘,尽管这是一个单独的问题。