Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Dijkstra时间复杂性澄清_Python_Graph_Shortest Path_Dijkstra_Path Finding - Fatal编程技术网

Python Dijkstra时间复杂性澄清

Python Dijkstra时间复杂性澄清,python,graph,shortest-path,dijkstra,path-finding,Python,Graph,Shortest Path,Dijkstra,Path Finding,对于使用最小堆优先级队列的Dijkstra实现,我将其设置为查找网络上不存在的站点,以便它必须检查所有内容。我的问题是,由于总体时间复杂度O(V+E log V),为什么一个网络查找到一个站点的最小距离所花费的时间要比一个具有500个边和500个站点的网络长500个边和400个站点的网络长 注:所有站点至少通过一条边连接。具有| E |=| S |+100的桩号具有100条唯一但随机连接的额外边 # PSEUDOCODE 1. INIT QUEUE & DICTIONARY WITH

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

注:所有站点至少通过一条边连接。具有| 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.

#伪代码
1.INIT队列和字典,与源的距离为INF
2.将距离为0的源排队
3.将源的“到源的距离”设置为0
4.队列不为空时循环
A.从队列中弹出站(称为P)
B如果P标记为已访问,则重新启动循环(继续)。
C如果P==目标返回距离
D通过所有相邻车站(A)至P的环路
我如果(A未标记为已访问)和(距离P+距离(P,A)<距离A)
1.将DIST更改为A以成为新DIST
2.将A推到优先级队列上。

我想当你说

为什么网络查找到一个站点的最小距离所花费的时间比一个具有500个边和500个站点的网络长500个边和400个站点,而该站点在一个具有500个边和400个站点的网络上不存在

您并不是说这对具有指定数量的节点和边的任何一对图都是正确的(因为它不是),而是说它对您构建和测试的一对特定的图实例是正确的

另一方面,时间复杂度语句给出了具有给定数量的节点和边的任何图实例的一般上界。换句话说,这是一个最坏的情况,即使对于算法最难快速处理的一个讨厌的图,也是如此


因此,这并不矛盾。您只是碰巧选择了图实例,其中较小的图实际上使算法更难发现没有路径。不管这个例子如何,对于具有400个节点(和500条边)的最差可能图,算法仍然比具有500个节点(和500条边)的最差可能图快。

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

|E |=| S |构成非常稀疏的图形。让我们举一个极端的例子。假设| s |=500,| E |=500,并且所有节点都整齐地排列在一个圆中。在每次迭代中,算法如下所示:

  • 从优先级队列中获取单个节点
  • 沿着单条边走
  • 将单个节点添加到PQ
一直以来,PQ都在运行,几乎为空。PQ是对常规队列的优化,但如果队列中只有一个节点,则没有太多需要优化的节点。当你知道N总是1时,谈论O(logn)是没有意义的。实际性能比Big-Oh符号预测的最坏情况性能要好得多

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


另外,这是Dijkstra,不是Djikstra。

是的,我同意,但这是基于实验时间,我使用timeit库添加了一个带有结果的图表。算法会导致这种情况吗?同样,这取决于您为测试选择的特定图形实例。我知道每个节点至少有一条边,但是你是如何为这些边选择其他节点的,你是如何设置边长度的?我没有设置边长度,我正在搜索一个网络上不存在的站点,s.t。所有站点都必须访问。随机+100边是唯一的,但随机连接(即,连接的两个站点是随机的,但没有预先存在的边)。网络上节点的位置是随机生成的,因此边的长度也是随机的。结果似乎有某种关联,或者我的假设是错误的?