python - Dijkstra 时间复杂度澄清

标签 python graph shortest-path dijkstra path-finding

对于使用最小堆优先级队列的 Dijkstra 实现,我将其设置为查找网络上不存在的站点,因此它必须检查所有内容。我的问题是,由于总体时间复杂度O(V + E log V),为什么网络需要花费时间来找到与 500 网络上不存在的站点的最小距离边和 400 个站比 500 个边和 500 个站长?

注意:所有站点至少通过 1 个边缘连接。带有|E|的车站=|S| + 100 有 100 条独特但随机连接的额外边

#  PSEUDOCODE

1. INIT QUEUE & DICTIONARY WITH DISTANCE TO SOURCE BEING INF
2. ENQUEUE SOURCE WITH DISTANCE 0
3. SET DISTANCE TO SOURCE FOR SOURCE TO 0
4. LOOP WHILE QUEUE NOT EMPTY
      a. POP STATION FROM QUEUE (CALL IT P)
      b. IF P MARKED AS VISITED THEN RESTART LOOP (CONTINUE).
      c. IF P == TARGET RETURN DIST
      d. LOOP THROUGH ALL ADJACENT STATIONS (A) TO P
          i. IF (A IS NOT MARKED AS VISITED) AND (DIST TO P + DIST(P,A) < DIST TO A)
             1. CHANGE DIST TO A TO BE THE NEW DIST
             2. PUSH A ONTO THE PRIORITY QUEUE.

Graph and Table depicting experimental time complexity

最佳答案

@Arne 是对的,这个问题很大程度上取决于实际使用的图表。

|E| =|S|形成一个非常非常稀疏的图。我们举一个极端的例子。假设您有 |S| = 500,|E| = 500,所有节点整齐排列成一圈。在每次迭代时,算法都会:

  • 从优先级队列中取出一个节点。
  • 遵循单边。
  • 向 PQ 添加单个节点。

一直以来,PQ 都接近空。 PQ 是对常规队列的一种优化,但如果队列中只有一个节点,则没有太多需要优化的地方。当您知道 N 始终为 1 时,讨论 O(log N) 就没有意义。实际性能比 Big-Oh 表示法预测的最坏情况性能要好得多。

现在添加 100 条边。突然之间,算法有了选择! PQ 已满。假设检查的第一个节点有 10 条边,因此 PQ 的大小为 10。它可能会在数十次迭代中保持这个大小。 PQ 终于有工作要做了!这就是额外时间消耗的来源。

附注这是 Dijkstra,不是 Djikstra。

关于python - Dijkstra 时间复杂度澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67254115/

相关文章:

python - Python中的线程优先级

algorithm - Dijkstra 算法的运行时间测量

javascript - 节点有时有多个父节点的数据集,如何以树状方式显示它? (d3.js 或类似的东西)

c++ - 两点之间网格中的最短路径。有一个陷阱

python - 在 Django 的请求工厂中使用无数据进行 POST

python - 在 __init__ 函数中循环?

python - 构建包含可变大小小部件的 QT Designer 布局

识别 "fuzzily-connected"子图的算法

java - 未加权无向图中的平均最短路径

寻找穿墙最短路径的算法