使用类'edge'和'node'对图形建模

时间:2016-02-28 12:53:17

标签: c++ oop graph

我必须在C ++中建模一个未加权的图并做BFS和DFS。但是,我必须创建两个单独的类:nodeedge,它们将包含node类型的两个末端。我不明白如何使用edge类在图表中进行任何搜索。如果是我,我只会创建node类,并在类中的列表/数组中包含节点X的邻居。有什么我想念的吗?我怎样才能获得班级edge的优势?有没有办法在不使用邻接矩阵或列表的情况下进行搜索?谢谢!

2 个答案:

答案 0 :(得分:2)

您仍然可以使用邻接列表。但是它们将不包含对其他节点的引用,而是包含对边缘实例的引用,而边缘实例又包含两个端点作为节点引用,如您所述。当然,这似乎有点多余,因为如果你有,在每个边说sourcetarget个节点,然后你使用node.edges[i].source之类的东西访问给定节点的某个边缘,那么你立即知道此source本身就是node,否则此边缘甚至不会在此节点的邻接列表中。但是,source可能仍然有用,如果你在某个地方单独传递一个边缘,那么你手边没有源节点。

除此之外,对于最简单的图形,这种方法看起来有点过分,因为边缘只存储源边缘和目标边缘,前者主要是多余的。但是您可能需要稍后使用权重,标签,残余流等辅助数据等扩展边缘类。因此,拥有这样的课程毕竟是一个好主意。

此外,一些算法直接在边缘上工作。例如,您可能需要搜索满足某个条件的边。拥有一个单独的类使您可以自由创建边缘列表,而无需pair<Node, Node>等特殊方法。

答案 1 :(得分:1)

你错过了存储边缘的空间复杂性常数。 将边存储在邻接矩阵/列表中时,必须为每个边存储(node1,node2)和(node2,node1)。 尽管大O的复杂性保持不变,但你的空间增加了一倍。 但是,必须考虑这种空间常数的时间。

当您希望节省尽可能多的空间时,可以利用类边缘,并且您希望随着时间的推移确定空间的优先级。

对所有边缘实例进行线性搜索是一种方法。 线性搜索速度很慢,但您会随着时间的推移优先考虑空间。 当你拥有分布式系统时,也许并行搜索是另一种方式,但你必须验证。

您的家庭作业问题可能会对边缘类的设计产生人为约束。人为约束的想法来自https://meta.stackexchange.com/questions/10811/how-do-i-ask-and-answer-homework-questions