C++ dijkstra的时间复杂度';最短路径的s算法取决于所使用的数据结构?

C++ dijkstra的时间复杂度';最短路径的s算法取决于所使用的数据结构?,c++,data-structures,graph-algorithm,dijkstra,C++,Data Structures,Graph Algorithm,Dijkstra,存储图形的一种方法是将节点实现为结构,如 struct node { int vertex; node* next; }; 其中vertex存储顶点编号,next包含指向其他节点的链接 我能想到的另一种方法是将其实现为向量,如 vector<vector< pair<int,int> > G; 向量G; 现在,在应用Dijkstra的最短路径算法时,我们需要构建优先级队列和其他所需的数据结构,如案例2(向量实现)。 上述两种不同的图形应用方法在复杂度上会有什

存储图形的一种方法是将节点实现为结构,如

struct node {
int vertex; node* next; 
};
其中vertex存储顶点编号,next包含指向其他节点的链接

我能想到的另一种方法是将其实现为向量,如

vector<vector< pair<int,int> > G;
向量G;
现在,在应用Dijkstra的最短路径算法时,我们需要构建优先级队列和其他所需的数据结构,如案例2(向量实现)。 上述两种不同的图形应用方法在复杂度上会有什么不同吗?哪一个更好

编辑: 在第一种情况下,每个节点都与可从给定节点直接访问的节点链表相关联。在第二种情况下, G.size()是图中的顶点数 G[i].size()是可从索引为i的顶点直接访问的顶点数 G[i][j]。首先是从顶点i可到达的第j个顶点的索引 G[i][j]。第二个是从顶点i到顶点G[i][j的边标题长度。第一个

都是。如果实现正确,预计将导致相同的时间复杂性。如果你使用一个新的方法,你会得到一个不同的时间复杂度

更详细地说,这可以归结为。当您在Dijkstra算法中迭代整个集合(即顶点的邻域)时,无论您使用的是数组还是链表,这都需要线性时间(
O(n)

如上所述,运行Dijkstra算法的结果复杂性为

O(| E | log | V |)
在这两种情况下都使用二进制堆。

从某种意义上说,当原始复杂性分析假设某个对象是O(1)(例如,访问数组)时,您将其替换为更复杂的对象,那么这将影响总体复杂性(在大多数情况下)。对于第一种表示,我说的每个顶点的链表(可以简化为
vector
),对吗?对于第二个问题,
G[x]
中的每一对是否都包含
x
(否则您需要详细说明)?@Dukeling是的,您是对的。我只是说。