Algorithm 迪克斯特拉';带数组的s算法运行时间

Algorithm 迪克斯特拉';带数组的s算法运行时间,algorithm,big-o,dijkstra,Algorithm,Big O,Dijkstra,在维基百科中,他们在标题下写道:“Dijstras算法的运行时间”是 O(| V | ^2+| E |*递减键)=O(| V |) 这是我第一次分析算法的时间复杂度,但我认为应该是: Outerloop(Q不是空的)将花费O(| v |)时间 数组中的Findmin应该取O(| v |) 一旦找到最小值,然后检查所有可以取O(| E |)的邻居 然后在恒定时间C中更新这些邻居的密钥 所以我们会 O(V)*(O(| V |)+O(| E |)C)=O(| V | ^2+O(| V | E |

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

O(| V | ^2+| E |*递减键)=O(| V |)

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

  • Outerloop(Q不是空的)将花费O(| v |)时间
  • 数组中的Findmin应该取O(| v |)
  • 一旦找到最小值,然后检查所有可以取O(| E |)的邻居
  • 然后在恒定时间C中更新这些邻居的密钥
所以我们会

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

我的问题是关于这个术语:

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


在维基百科中,他们甚至根本不去考虑“V”因素,为什么?我的分析错了吗?

您的逻辑中的问题是:

一旦找到最小值,然后检查所有可以取O(| E |)的邻居


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

逻辑中的问题如下:

一旦找到最小值,然后检查所有可以取O(| E |)的邻居


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

我不确定你所说的“干扰| V |因子”是什么意思,但是
|V |*| E |
是不准确的。每个边最多只能访问两次(当访问其每个端点时),因此
2*| E |
更准确,这只是
O(| E |)
<代码>|E |在一个简单的图形中最多是
|V |
顶点的完整图形中的顶点数,即
(|V |^2-|V |)/2=O(| V | ^2)
。我不确定你所说的“干扰| V |因子”是什么意思,但
| V |*| E |
是不准确的。每个边最多只能访问两次(当访问其每个端点时),因此
2*| E |
更准确,这只是
O(| E |)
<在一个简单的图中,code>|E |最多是
|V |
顶点的完整图中的顶点数,即
(|V |^2-|V |)/2=O(| V | ^2)
。好的,但它们是如何得出这个公式的:“对于顶点集的任何实现,运行时间都是以“O(| E | T{dk}T}为单位的)其中em=提取最小值,dk=减少关键点。我知道T{em}是O(| V |)(当使用数组时),但是为什么| E |来自哪里@Ryanok但是他们是如何得出这个公式的:“对于顶点集的任何实现,运行时间是在”O(| E |*T{dk}+| V |*T{em})中,其中em=提取最小值,dk=减少关键值。我知道T{em}是O(| V |)(当使用数组时),但是为什么| E |来自哪里@赖安