我见过几篇论文和幻灯片,提到了Dial实现Dijkstra的单源最短路径算法。他们都说桶被存储为双向链表。 (例如http://www.cs.ucsb.edu/~suri/cs231/ShortestPaths.pdf,http://www.acsu.buffalo.edu/~nagi/courses/684/4.shortestpath.pdf)。但是,所需的操作只是这个(据我所知):
检查存储桶是否为空
将节点添加到存储桶(顺序无关紧要)
在删除传递的节点时迭代存储桶。
所有这些都可以轻松地使用单链表完成(对于2,只需将指向列表开头的指针更改为新节点,并将其下一个指针更改为存储桶中的旧第一个节点)
那么,我是否有理由错过为什么需要一个双向链表呢?
答案 0 :(得分:1)
我明白了。我错过的操作是,当我们迭代一个桶时,我们需要移动相邻的顶点,以便从其他桶中删除它们的节点。这可以在O(1)
中为双向链接列表完成,O(size of bucket)
用于单链接列表。