当前位置: 首页 > 知识库问答 >
问题:

Dijkstra最小堆算法的时间复杂度及其优化

吕皓
2023-03-14

Dijkstra算法的这种特殊实现的时间复杂度是多少?

我知道这个问题的几个答案是,当你使用最小堆时,O(E log V),这篇文章和这篇文章也是如此。然而,这里的文章说的是O(V ElogE),它的逻辑与下面的代码类似(但不完全相同)。

算法的不同实现可以改变时间复杂度,我试图分析下面实现的复杂性,但是像检查visitedSet和忽略minHeap中的重复顶点这样的优化让我怀疑自己。

以下是伪代码:

dart prettyprint-override">// this part is O(V)
for each vertex in graph {
  distanceMap[vertex] = infinity
}

// initialize source vertex
minHeap.add(source vertex and 0 distance)
distanceMap[source] = 0
visitedSet.add(source vertex)

// loop through vertices: O(V)?
while (minHeap is not empty) {

  // Removing from heap is O(log n) but is n the V or E?
  vertex and distance = minHeap.removeMin
  if (distance > saved distance in distanceMap) continue while loop

  visitedSet.add(vertex)

  // looping through edges: O(E) ?
  for (each neighbor of vertex) {
    if (visitedSet contains neighbor) continue for loop

    totalDistance = distance + weight to neighbor
    if (totalDistance < saved distance in vertexMap) {

      // Adding to heap is O(log n) but is n the V or E?
      minHeap.add(neighbor and totalDistance)
      distanceMap[neighbor] = totalDistance
    }
  }
}

笔记

  • 从源顶点可到达的每个顶点将至少被访问一次。
  • 每个顶点的每个边(邻居)被检查,但如果在visitedSet
  • 中忽略
  • 只有当邻居的距离短于当前已知距离时,才会将其添加到堆中。(未知距离被假定为默认长度为无穷大。)

这个实现的实际时间复杂度是多少?为什么?

共有1个答案

梁渊
2023-03-14

>

为什么不呢?假设一个连通的,简单的,非平凡的图,我们有Θ(E log V)=Θ(E log E)自log(V)−1) ≤ 日志E

算法依赖于单个顶点的时间常数。然而,在稀疏图上实现这个问题可能会更快。

 类似资料:
  • 每个顶点可以连接到(V-1)个顶点,因此每个顶点的相邻边数是V-1。假设E代表连接到每个顶点的V-1条边。 查找和更新最小堆中每个相邻顶点的权重为O(log(V))+O(1)或 因此,从上面的步骤1和步骤2,更新顶点的所有相邻顶点的时间复杂度是e*(logV)。或. 因此所有V顶点的时间复杂度为V*(E*logv),即。 但Dijkstra算法的时间复杂度为O(ElogV)。为什么?

  • 注:∈/ 意思是不在,我不能在代码中输入。 这个问题可能与一些帖子重复。 理解Dijkstra算法的时间复杂度计算 Dijkstra算法的复杂性 Dijkstras算法的复杂性 我读过它们,甚至读过Quora上的一些帖子,但仍然无法理解。我在伪代码中添加了一些注释,并试图解决它。我真搞不懂为什么它是O(E log V)

  • 我在CLRS,第三版(第662页)中读到了Dijkstra的算法。下面是我不明白的书中的一部分: 如果图足够稀疏--特别是-我们可以通过用二进制最小堆实现最小优先级队列来改进算法。 为什么图形应该是稀疏的? 下面是另一部分:

  • 我的问题是:每个节点的优先级是什么?我认为它是最小值的传入边缘的权重,但我不确定。这是真的吗? 第二个问题,当我提取队列的根时,如果这个节点不与任何一个被访问的节点邻接,它将如何工作?

  • 算法的时间与空间复杂度 看到群里们小伙伴在讨论算法复杂度问题,之前在极客时间看了王争的《数据结构与算法之美》,看的我也晕呼呼的,跟上学时在学校老师的讲的有点不一样了,网上搜了下各种各样的,结合参考作一篇简单易懂的总结。 什么是算法 算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作。 如何评价一个算法的好坏 一般我们会从以下维度来评估算法的优劣 正确性

  • 我只是想知道2D中Dijkstra的时间复杂性 我知道Dijkstra与二进制堆是O(ElogV) 但是如果我们有一个n乘n的2D数组,数组中的每个节点都有顶点(x,y,权重) 它可以向四个方向移动上,下,左,右 因此,总顶点是n^2,边缘大约是4(n^2)。例如,如果顶点在 因此,如果我们在2D中运行该算法,那么时间复杂度将降低 - 是这样吗? 我渴望得到答案。。谢谢你阅读这篇文章。