Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/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
Algorithm 为什么在拨号';Dijkstra的s版本';s算法?_Algorithm_Dijkstra - Fatal编程技术网

Algorithm 为什么在拨号';Dijkstra的s版本';s算法?

Algorithm 为什么在拨号';Dijkstra的s版本';s算法?,algorithm,dijkstra,Algorithm,Dijkstra,我看过的几篇论文和幻灯片都提到了Dial对Dijkstra的单源最短路径算法的实现。他们都说一个bucket存储为一个双链接列表。(例如,)。然而,所需的操作仅限于此(据我所知): 检查铲斗是否为空 将节点添加到bucket(顺序无关紧要) 在删除传递的节点时在bucket上迭代 所有这些都可以通过单链表轻松完成(对于2,只需将指向列表开头的指针更改为新节点,并将其下一个指针更改为指向bucket中旧的第一个节点) 那么,有没有什么原因我不知道为什么双链接列表是可取的呢?我想出来了。我错过的操作

我看过的几篇论文和幻灯片都提到了Dial对Dijkstra的单源最短路径算法的实现。他们都说一个bucket存储为一个双链接列表。(例如,)。然而,所需的操作仅限于此(据我所知):

  • 检查铲斗是否为空

  • 将节点添加到bucket(顺序无关紧要)

  • 在删除传递的节点时在bucket上迭代

  • 所有这些都可以通过单链表轻松完成(对于2,只需将指向列表开头的指针更改为新节点,并将其下一个指针更改为指向bucket中旧的第一个节点)


    那么,有没有什么原因我不知道为什么双链接列表是可取的呢?

    我想出来了。我错过的操作是,当我们在一个桶上迭代时,我们需要移动相邻的顶点,从而从其他桶中删除它们的节点。对于双链接列表,可以在
    O(1)
    中执行此操作;对于单链接列表,可以在
    O(bucket大小)
    中执行此操作