【发布时间】:2015-02-01 15:11:57
【问题描述】:
问题
我想实现一些在图上工作的算法并返回节点对的分数,指示这些节点是否相似。这些算法应该适用于单个节点对和所有可能的节点对。在后一种情况下,应返回集合/矩阵。
我的方法
算法源自
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();
}
问题
- 这种设计方法是解决这个问题的好主意吗?
- 是否应该公开集合都作为矩阵实现的事实?
【问题讨论】:
-
您确定要按值获取节点吗?协方差的尝试应该会奏效。
-
节点实际上只是 unsigned long 的 typedef。我认为在这种情况下按价值计算是可以的。
-
当然,如果是这样的话,身份可能并不重要。
-
如果功能相同,您可以将“SimilarityAlgorithm”作为类模板并传入“runAll()”所需的返回类型。
标签: c++ algorithm matrix class-design covariant