問題
グラフで機能し、ノードが類似しているかどうかを示すノードペアのスコアを返すアルゴリズムをいくつか実装したいと考えています。アルゴリズムは、単一のノード ペアとすべての可能なノード ペアで機能する必要があります。後者の場合、コレクション/マトリックスが返されます。
私のアプローチ
アルゴリズムはから派生します
class SimilarityAlgorithm {
public:
Base(const Graph& G);
virtual double run(node u, node v) = 0; // indices for nodes in the graph
virtual ScoreCollection& runAll() = 0;
}
現在、アルゴリズムはメモリ使用量が異なります。一部のアルゴリズムは対称的であり、(u, v) と (v, u) のスコアは同一です。これには、返されるさまざまな ScoreCollection タイプが必要です。例としては、疎行列と三角行列があり、どちらも から派生しScoreCollection
ます。
これは、共変の戻り値の型に要約されます。
class SpecificAlgorithm : SimilarityAlgorithm {
public:
double run(node u, node v);
// The specific algorithm is symmetric and thus uses a symmetric matrix to save memory
SymmetricScoreCollection& runAll();
}
質問
- この設計アプローチは、この問題に適していますか?
- コレクションがすべて行列として実装されているという事実を公開する必要がありますか?