为什么图算法的时间复杂度用|E|而不是使用 |V|^2?

Why do the time complexity of graph algorithms use |E| instead of using |V|^2?

Dijkstra算法和Bellman Ford算法的时间复杂度不应该分别是O(|V|^2)O(|V|^3)吗?我一直在阅读他们的伪代码 here and here

Bellman Ford 算法和 Dijkstra 算法看起来很相似,除了 Bellman Ford 算法执行与 Dijkstra 算法相同的过程 |V| 次(其中 |V| 是节点数)。那么,为什么我访问的每篇关于该主题的文章都说 Dijkstra 算法的运行时间复杂度为 O(|v|^2) 而 Bellman Ford 算法的运行时间复杂度为 O(|V||E|)?我哪里错了(如果我真的错了)?

更新: 你不觉得: |E| = (|V|^2 - |V|)/ 2 如果每个节点都连接到其他节点?因此,让我们假设每个节点都与其他每个节点相连。现在我们得到 Bellman Ford 算法的 O(|V|^3)。我说得对吗?

所以我们有 O(|V||E|) = O(|V|(|V|^2 - |V|)/2) = O(|V|^3)。那正确吗?如果不是,我哪里错了?

Shouldn't the time complexity of Dijkstra's algorithm and Bellman Ford algorithm be O(|V|^2) and O(|V|^3) respectively?

(1),但这不会是一个严格的界限。同样,您可以说它是 O(|V|^5),它也是正确的(回想一下大 O 是渐近上界,而不是紧上界)。
很多图不是稠密的,而是稀疏的,连接到每个顶点的边数是次线性的。所以,如果我们使用 |E|还有符号,我们可以获得更好更紧密(和更多信息)的界限。

类似地,考虑一种遍历大小为 nxm 的矩阵的算法。说算法是 O(n*m) 比说它是 O(max{n,m}^2) 更能提供信息,不是吗?

关于 Dijkstra 算法的实现,实际复杂度在很大程度上取决于最小堆实现中的修改值,而有些实现可以在对数时间内完成(总共 O(|E|+|V|log|V|) 时间,一些实现不会打扰,只是寻求在 O(|V|^2).

中运行的更简单的解决方案

(1) 这里假设简单图