Dijkstra的算法运行时间与数组

时间:2017-02-09 09:01:33

标签: algorithm big-o dijkstra

在维基百科中他们在标题下说:Dijstras算法的“运行时间”是

O(| V | ^ 2 + | E | * decreaseKey)= O(| V |)

Dijkstra's_algorithm

这是我第一次分析算法的时间复杂度,但在我看来应该是:

  • Outerloop(虽然Q不为空)将花费O(| v |)时间
  • 数组中的Findmin应该采用O(| v |)
  • 一旦找到Min,然后检查所有可以采取O(| E |)
  • 的邻居
  • 然后更新这些neigbors的密钥是在恒定时间C
  • 完成的

所以我们将

O(V)*(O(| V |)+ O(| E |) C)= O(| V | ^ 2 + O(| V | | E | * C) ))= O(| V | ^ 2)

我的问题是关于这个词:

O(| V | * | E | * C)

在维基百科,他们甚至不打扰| V |因素有什么原因?我的分析错了吗?

1 个答案:

答案 0 :(得分:2)

你的逻辑中存在的问题是:

  

一旦找到Min,然后检查所有可以采取O(| E |)

的邻居

单个节点只能有O(| V |)个邻居,而不能是O(| E |)。 E是所有图中的边。