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

What is the best standard data structure to build a Graph?

本文关键字:数据结构 是什么 标准 最佳 构建      更新时间:2023-10-16

首先我是c++的初学者,我正在自学它,所以请在答案中相当简单…

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

我正在寻找的是我应该使用什么来构建这个图考虑到我想使用dijkstra算法来获得从一个点到另一个点的最短路径…所以我认为搜索性能应该是最重要的!!

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

提前感谢您的帮助

您可以定义如下的Edge结构

struct Edge
{
    int destination;
    int weight;
};

并创建一个图形

vector<vector<Edge> > graph;

然后要访问所有来自顶点u的边,你可以这样写

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

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

Edge newEdge;
newEdge.destination = 7;
newEdge.weight = 8;
graph[3].push_back( newEdge );

等。

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

应该没问题。

编辑基础容器(std::vector, std::list, std::map)的选择取决于用例,例如,你经常用图做什么:添加/删除顶点/边,只是遍历。一旦你的图被创建,std::liststd::vector同样适合Dijkstra, std::vector由于放松阶段的顺序访问模式而更快。

如果你有大量的顶点,使用unordered_map<int,vector<int>>来表示邻接表。如果你打算实现一个小规模的图,那么就使用向量数组。例如:vector<int> v[20];

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

包含节点的图,每个节点都有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|

所以,二维数组是矩阵的一个很好的表示。

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