问题
我想实现一些在图表上工作的算法并返回节点对的分数,指示这些节点是否相似。这些算法应该适用于单个节点对和所有可能的节点对。在后一种情况下,应返回集合/矩阵。
我的方法
算法源自
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();
}
问题
- 这种设计方法是解决这个问题的好主意吗?
- 是否应该公开集合都作为矩阵实现的事实?