直截了当的Dijkstra算法的时间复杂度

时间:2019-12-23 23:00:17

标签: algorithm time-complexity dijkstra

我很难看到直接实现Dijkstra算法(没有堆)的O(mn)界限。在我的实现和其他实现中,我发现主循环迭代n-1次(对于不是源的每个顶点,n-1),然后在每次迭代中,找到最小顶点为O(n)(检查队列中的每个顶点)并找到到源的最小距离),然后每个发现的最小顶点将最多具有n-1个邻居,因此更新所有邻居为O(n)。在我看来,这将导致O(n ^ 2)的界线。我的实现在下面提供

     Name  Hobbys          Gender Language
0   Murat  Kitap, Resim    Erkek  İngilizce
1     Ali   Film, Müzik    Erkek  İngilizce
2  İsmail          Yazı    Erkek  İngilizce
3    Emre        Hayvan    Erkek     Türkçe
4    Ekin        Sinema    Kadın  İngilizce

    Name  Hobbys          Gender Language
0   John        Yazı    Erkek    İngilizce
1     SS   Film, Müzik    Erkek  İngilizce
2    FFF          Yazı    Erkek     Türkçe
3  CXCXC  Kitap, Resim    Erkek     Türkçe
4      X        Sinema    Kadın  İngilizce

我认为这是不正确的,但是我无法确定m个因素在哪里。

1 个答案:

答案 0 :(得分:0)

您的实现确实消除了M因子,至少如果我们仅考虑简单图(两个顶点之间没有多个边)的话。是O(N ^ 2)!如果要遍历所有可能的边而不是顶点,那么复杂度将为O(N * M)。

编辑:好吧,实际上它是O(M + N ^ 2)。在某些顶点中更改值在算法中需要O(1)时间,并且每次您考虑边时都可能发生,也就是说,发生M次。这就是为什么复杂度为M的原因。

不幸的是,如果要使用简单堆,则复杂度将为O(M * log M)(或M log N)。为什么?您无法快速更改堆中的值。因此,如果dist [v]突然减小,因为您找到了通​​往v的更好的新路径,那么您就不能只在堆中对其进行更改,因为您实际上并不知道它的位置。您可以在堆中放入v的副本,但是堆的大小为O(M)。即使您存储位置并巧妙地更新了位置,堆中也可能有O(N)个项目,但是每次更改后仍必须更新堆,这需要O(堆大小)。您最多可以将值更改为O(M)次,这使O(M * log M(或N))复杂度