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

时间:2015-10-02 04:35:43

标签: algorithm time-complexity dijkstra bellman-ford

Dijkstra算法和Bellman Ford算法的时间复杂度不应分别为O(|V|^2)O(|V|^3)吗?我一直在阅读herehere的伪代码。

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

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

所以我们O(|V||E|) = O(|V|(|V|^2 - |V|)/2) = O(|V|^3)。是对的吗?如果没有,我哪里出错了?

1 个答案:

答案 0 :(得分:2)

  

不应该是Dijkstra算法和Bellman Ford的时间复杂度   算法分别为O(| V | ^ 2)和O(| V | ^ 3)?

(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)假设这里有简单的图表