为什么在Dial的Dijkstra算法版本中使用双链表?

时间:2014-01-21 12:13:41

标签: algorithm dijkstra

我见过几篇论文和幻灯片,提到了Dial实现Dijkstra的单源最短路径算法。他们都说桶被存储为双向链表。 (例如http://www.cs.ucsb.edu/~suri/cs231/ShortestPaths.pdfhttp://www.acsu.buffalo.edu/~nagi/courses/684/4.shortestpath.pdf)。但是,所需的操作只是这个(据我所知):

  1. 检查存储桶是否为空

  2. 将节点添加到存储桶(顺序无关紧要)

  3. 在删除传递的节点时迭代存储桶。

  4. 所有这些都可以轻松地使用单链表完成(对于2,只需将指向列表开头的指针更改为新节点,并将其下一个指针更改为存储桶中的旧第一个节点)

    那么,我是否有理由错过为什么需要一个双向链表呢?

1 个答案:

答案 0 :(得分:1)

我明白了。我错过的操作是,当我们迭代一个桶时,我们需要移动相邻的顶点,以便从其他桶中删除它们的节点。这可以在O(1)中为双向链接列表完成,O(size of bucket)用于单链接列表。