で
おかげで最も参考になる、Graph Equalityは多項式時間で扱いやすいことが知られていないという問題点です。実際には、合理的な時間内に解決することは事実上不可能かもしれないことを意味する(それはNP-completeであることは知られていないが)。しかし、頂点ラベルが同じであることに懸念がある場合は、両方のグラフですべてのエッジを繰り返し処理し、それぞれのグラフが他のグラフにも存在することを確認するだけで十分です。
編集は:頂点ラベル(各頂点に関連付けられた値)は、両方のグラフに同じであり、ユニークと同等である場合、我々は次のように、容易にO(V LG V + E LG E)に同型確認することができそう:Boost.Graphは==演算子でこれを行うことはできませんが
If |G1| != |G2|, the graphs are non-equal. Abort.
i = 0
For each vertex V in G1:
G1_M[Label(V)] = V
G1_I[V] = i
i = i + 1
For each vertex V in G1:
G1_E[V] = sort(map(λDestination -> G1_I[Destination]) Edges[V])
For each vertex V in G2:
If G1_M[Label(V)] does not exist, the graphs are non-equal. Abort.
G2_corresp[V] = G1_M[Label(V)]
G2_I[V] = G1_I[G2_corresp[V]]
For each vertex V in G2:
G1_E[V] = sort(map(λDestination -> G2_I[Destination]) Edges[V])
Compare G1_E[G2_corresp[V]] and G2_E[V]. If non-equal, the graphs are non-equal. Abort.
If we get here, the graphs are equal.
ありがとうstribika。これは私が探しているものを提供するようです。私のグラフは大きくはありません。グラフが1つの親ノードにしか接続されておらず、兄弟(ツリーのようなもの)には接続されていない、各ノードがグラフごとに約30ノード以上あります。 – ossandcad
30が多すぎる可能性があります。ドキュメンテーションはそれがO(n!)と30だと言っています!約10^32です。 – stribika
私は、数千のノードを持つグラフでグラフ同型アルゴリズムを使用しました。実行時間は、ノードの接続方法に大きく依存します(ブーストは使用せず、独自の実装を使用しています)。 – AProgrammer