构建图的最佳标准数据结构是什么?
What is the best standard data structure to build a Graph?
首先我是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::list
或std::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];
- 用于筛子的最佳数据结构是什么(即一些被划掉的数字列表)?
- 表示图像矩阵的理想数据结构是什么?
- 存储大量会话的最有效数据结构是什么?
- 给定 C# 代码的正确数据结构是什么
- 可用于存储和管理整数集合的最佳C++数据结构是什么
- 通常用于将输入映射到显示器的数据结构是什么
- A*开放集的最佳数据结构是什么
- C++中的地图数据结构是什么
- 可以处理随机访问和键搜索的数据结构是什么?
- C++ STL 堆栈中使用的基本数据结构是什么?
- 从中间删除元素的最佳数据结构是什么
- 设计PRIM算法最有效的数据结构是什么
- c++中顺序插入/读取/删除最快的数据结构是什么?
- 在我的神经网络程序中使用的最有效的数据结构是什么?我的程序需要动态分配吗?
- 当需要修改元素时,另一种类似集合的数据结构是什么?
- 搜索和更新整数值列表最快的数据结构是什么?
- 一般阶跃函数的最佳数据结构是什么?
- 池容器的最佳数据结构是什么?
- 构建图的最佳标准数据结构是什么?
- 插入和搜索元素最快的数据结构是什么