使用二进制堆的Dijkstra时间复杂度

时间:2018-05-22 02:12:13

标签: algorithm graph

设G(V,E)是具有正边权重的无向图。 Dijkstra的单源最短路径算法可以使用具有时间复杂度的二进制堆数据结构来实现:

  1. O(| V | 2)
  2. O(| E | + | V |登录| V |)
  3. O(| V |登录| V |)
  4. O((| E | + | V |)日志| V |)
  5. =============================================== =========================

    正确答案是 -

      
        
    1. O((| E | + | V |)日志| V |)
    2.   

    =============================================== ==========================

    我的方法如下 -

    O(V + V + VlogV + ElogV)= O(ElogV)

    • O(V)初始化。
    • O(V)来构建堆。
    • VlogV执行Extract_Min
    • ElogV执行Decrease Key
      

    现在,当我得到O(ElogV)并且当我看到选项时,我的一部分说了   正确的一个是O(VlogV),因为对于稀疏的Graph | V | = | E |,但是和我一样   说正确的答案是O((| E | + | V |)log | V |)。那么,我要去哪里   错?

2 个答案:

答案 0 :(得分:2)

嗯,你是正确的,复杂性实际上是 O(E log V)

由于 E 最高可达(V ^ 2 - V)/ 2 ,这与 O(V log V)

如果每个顶点都有边,那么 V <= 2E ,所以在这种情况下, O(E log V)= O((E + V)log V)< / strong>即可。这是通常的情况,并且对应于&#34;正确的&#34;答案。

但从技术上讲, O(E log V) O((E + V)log V)不同,因为可能有一大堆 V 中断开的顶点。但是,在这种情况下,Dijkstra的算法将永远不会看到所有这些顶点,因为它只找到连接到单个源的顶点。所以,当这两种复杂性之间的差异很重要时,你就是正确的答案&#34;正确答案&#34;不是。

答案 1 :(得分:1)

让我这样说吧。正确的答案是O((E + V)logV))。如果图的源顶点无法到达所有其他顶点,则VlogV可能大于ElogV。我们假设源顶点可以到达其他每个顶点,那么图将至少具有V-1边。因此,它将是ElogV。这更多地取决于源顶点的可达性。