無向グラフが与えられた場合、それがサイクルを含むかどうかを検出するための最良のアルゴリズムは何ですか?
訪問したノードを追跡しながら幅優先または深さ優先探索を行う方法の1つですが、これはO(n ^ 2)です。もっと速いものはありますか?
無向グラフが与えられた場合、それがサイクルを含むかどうかを検出するための最良のアルゴリズムは何ですか?
訪問したノードを追跡しながら幅優先または深さ優先探索を行う方法の1つですが、これはO(n ^ 2)です。もっと速いものはありますか?
与えられたグラフ G(V,E) の BFS および DFS アルゴリズムの時間計算量は O(|V|+|E|) です。ご覧のとおり、入力の線形依存性です。非常に特殊なグラフがある場合は、いくつかのヒューリスティックを実行できますが、一般に、そのために DFS を使用することはそれほど悪くありません。ここでいくつかの情報を確認できます。とにかく、グラフ全体をトラバースする必要があります。
O(V)
アルゴリズムは次のとおりです。
def hasCycles(G, V, E):
if E>=V:
return True
else:
# here E<V
# perform O(E+V) = O(V) algorithm
...
... は DFS で実行できます。およびエッジが意味のある方法で (リストとして) 保存されている場合E<V
は、おそらく O(E)+logs を実行して、アルゴリズム全体を作成できますO(min(E,V))+logs
。
少し遅れますが、この回答が気に入っていただければ幸いです。
グラフが隣接リストを使用して表されている場合、深さ優先探索を使用してグラフG(V、E)にサイクルが存在するかどうかをテストするのはO(| V |、| E |)です。
サイクルがないことを示すには、グラフ全体をトラバースする必要があります。単にサイクルの有無に関心がある場合は、サイクルが検出された時点で明らかに終了できます。
単純なグラフがある場合は、循環数を計算できます。
C = E − N + P
ここで、C はサイクル数、E はエッジ数、N はノード数、P はコンポーネント数です。グラフが接続されている場合、次のようになります。
C = E - N + 1