多くのグラフ (最大数百万のグラフ比較) を比較する必要がありますが、それを行うための最速の方法は何でしょうか。
グラフの頂点は最大 8 つの隣接/エッジを持つことができ、頂点は値 0 または 1 を持つことができます。回転したグラフは同じグラフであり、すべてのグラフは同じ数の頂点を持ちます。
グラフは次のようになります。
現在、最初のグラフから 1 つの頂点を取得し、2 番目のグラフのすべての頂点と比較して、グラフを比較しています。同一の頂点が見つかった場合は、両方の頂点の隣接点が同一であるかどうかを確認し、グラフが同一かどうかがわかるまでこれを繰り返します。
このアプローチは遅すぎます。確実に異なるグラフを捨てずに、数千のグラフと約 100 の頂点を比較するのに 40 秒以上かかります。
すべてのグラフの一意の値を計算し、値のみを比較することを考えていました。私はこれをやろうとしましたが、等しい場合はグラフが等しい可能性があり、値が異なる場合はグラフも異なるという値しか思いつきませんでした。
私のプログラムがこれらの値を比較すると、約 2.5 秒ですべてが計算されます (それでも遅すぎます)。
そして、このグラフに頂点を追加してエッジを更新する最良/最速の方法は何ですか? std::map< COORD, Vertex >
頂点を検索する方が簡単/高速だと思うので、現在このグラフを保存しています。
COORD はゲーム ボード上の頂点の位置 (頂点の位置はグラフを比較する際には関係ありません) であり、頂点は次のとおりです。
struct Vertex
{
Player player; // Player is enum, FIRST = 0, SECOND = 1
Vertex* neighbours[8];
};
そして、このグラフは、ボードの端でラッピングされた五目並べの現在のボードの状態と、ボードのサイズ n*n (n は 2^16 まで) を表しています。
これを書いている間、あまり多くの間違いを犯さなかったことを願っています。誰かが私を助けてくれることを願っています。