实现图形程序
Implementing Graph Program
我正在尝试使用数组通过邻接矩阵实现图形。
但是我偶然发现了一个问题
我的图表有像 5、7、3、6 这样的顶点(它们不是为了映射到数组索引)。
我知道要实现的是它们与数组索引相同。
我想制作另一个带有顶点和数组索引的查找数组。
但是这样会使得它的时间复杂度很高。
我也尝试在 Google 上搜索,但我找到的只是数组索引。
任何建议都会对邻接表或矩阵有所帮助
我可以想到两个直接的选择:
1.顶点标记
对于您阅读的每个顶点,用标签标识它。在你的情况下:
vertex | tag
-------|-----
5 | 0
7 | 1
3 | 2
6 | 3
为了获得良好的性能,您应该使用 unordered_map
(或散列映射)以正反顺序映射顶点,这样当给定一个顶点时,您可以得到它的标签在 O(1) 中带有 forward[vertex]
,当你得到一个标签时,你可以在 O(1) 中用 backwards[tag]
:
找到它的顶点
int tag = 0;
unordered_map<int, int> forward, backwards;
for(int v : vertices){
forward[v] = tag;
backwards[tag] = v;
tag++;
}
最后,如您所知,使用标记 0、1、...、n - 1 将您的图表示为邻接表。
2。直接映射
这更容易。不要为顶点使用数组,而是使用 unordered_map
将顶点值映射到它的邻接列表:
unordered_map<int, vector<int>> G;
for(int v : vertices){
G[v] = vector<int>();
vector<int> &adj = G[v];
//add all nodes adjacent to v in adj
}
如果你想遍历5的邻接表,只需这样做:
vector<int> &adjList = G[5];
for(int v : adjList){
//stuff
}
我正在尝试使用数组通过邻接矩阵实现图形。 但是我偶然发现了一个问题 我的图表有像 5、7、3、6 这样的顶点(它们不是为了映射到数组索引)。 我知道要实现的是它们与数组索引相同。 我想制作另一个带有顶点和数组索引的查找数组。
但是这样会使得它的时间复杂度很高。 我也尝试在 Google 上搜索,但我找到的只是数组索引。
任何建议都会对邻接表或矩阵有所帮助
我可以想到两个直接的选择:
1.顶点标记
对于您阅读的每个顶点,用标签标识它。在你的情况下:
vertex | tag
-------|-----
5 | 0
7 | 1
3 | 2
6 | 3
为了获得良好的性能,您应该使用 unordered_map
(或散列映射)以正反顺序映射顶点,这样当给定一个顶点时,您可以得到它的标签在 O(1) 中带有 forward[vertex]
,当你得到一个标签时,你可以在 O(1) 中用 backwards[tag]
:
int tag = 0;
unordered_map<int, int> forward, backwards;
for(int v : vertices){
forward[v] = tag;
backwards[tag] = v;
tag++;
}
最后,如您所知,使用标记 0、1、...、n - 1 将您的图表示为邻接表。
2。直接映射
这更容易。不要为顶点使用数组,而是使用 unordered_map
将顶点值映射到它的邻接列表:
unordered_map<int, vector<int>> G;
for(int v : vertices){
G[v] = vector<int>();
vector<int> &adj = G[v];
//add all nodes adjacent to v in adj
}
如果你想遍历5的邻接表,只需这样做:
vector<int> &adjList = G[5];
for(int v : adjList){
//stuff
}