构建图表的最佳标准数据结构是什么?

时间:2011-07-29 19:51:03

标签: c++ data-structures graph performance

起初我是c ++的初学者,我自学它,所以请回答相当简单......

我需要编写一个包含节点的图表,每个节点都有id和边缘列表,每个边缘都有另一个节点id和距离

我正在寻找的是我应该用什么来构建这个图,因为我想使用dijkstra算法将最短路径形成一个点到另一个...所以搜索性能应该是我认为最重要的! !

我搜索了很多,现在我很困惑

提前感谢您的帮助

3 个答案:

答案 0 :(得分:11)

您可以定义{/ 1}}结构,如

Edge

并创建一个图表

struct Edge
{
    int destination;
    int weight;
};

然后,要访问来自顶点vector<vector<Edge> > graph; 的所有边,您可以编写类似

的内容
u

您可以动态添加新边,例如从第3个顶点到第7个边的边,权重为8:

for( int i = 0; i < graph[u].size(); ++i ) {
    Edge edge = graph[u][i];
    // here edge.destination and edge.weight give you some details.
}

对于无向图,您当然不应忘记添加对称边。

这应该没问题。

修改 基本容器(Edge newEdge; newEdge.destination = 7; newEdge.weight = 8; graph[3].push_back( newEdge ); std::vectorstd::list)的选择取决于用例,例如你经常用图表做什么:添加/删除顶点/边,只是遍历。创建图表后,std::mapstd::list同样适用于Dijkstra,std::vector由于放松阶段的顺序访问模式而更快一些。

答案 1 :(得分:0)

  

包含节点的图表,每个节点都有id和边缘列表,每个边缘都有另一个节点id和距离

如果我们将每个节点id视为索引。我们可以如下绘制边的nxn矩阵。

这可以帮助您绘制带边的图形。

     [0][1][2][3]

[0] | 1  0  0  0|
[1] | 0  0  1  0|
[2] | 1  0  0  1|
[3] | 0  0  1  0|

因此,2D数组是矩阵的良好表示。

int maxtrix[4][4] = new int[4][4];

答案 2 :(得分:-1)

我个人会使用std::map<Node*, std::set<Node*> >。这非常有用,因为每次您在一个节点时,您都​​可以快速找到该节点所连接的节点。如果需要,迭代所有节点也非常容易。如果您需要在边缘放置权重,可以使用std::map<Node*, std::set< std::pair<int, Node*> > >。这将比使用矢量提供更好的性能,尤其是对于大型图形。