Dijkstra的算法是否只是具有优先级队列的BFS?


21

根据此页面,Dijkstra的算法只是具有优先级队列的BFS。真的那么简单吗?我觉得不是。


1
你为什么这么认为?
拉斐尔

@Raphael因为它看起来太简单了,所以是:我再次研究了它,现在发现它无法跟踪节点之间的距离,因此它实际上是一个BFS,而不是Dijkstra。
巴里·弗鲁特曼

1
好吧,Dijkstra 确实更改了队列“排序”的值(通常称为“松弛”);如果您禁止这样做,那就不一样了,是真的。
拉斐尔

Answers:


19

您可以将Dijkstra的算法实现为具有优先级队列的BFS(尽管这不是唯一的实现)。

Dijkstra的算法依赖于以下特性:从到的最短路径也是到该路径上任何顶点的最短路径。这正是BFS所做的。sŤ

或从另一个角度来看:如果所有权重均为1,Dijkstra的算法将如何表现?就像BFS。


4

首先,我们如何使BFS适应更一般的加权图?G=VË

这是Dasgupta等人在《算法(第4.4节)》一书中提出的一个想法:

对于任何边缘的(与重量),通过替换它长度的边缘,加入虚拟节点之间和。Ë=üvËËË1个Ë-1个üv

结果,结果图的边缘都具有单位长度。因此,我们可以通过在G '上运行BFS 来计算的距离。GGG

其次,基于 Dijkstra算法如何在变换后的图形上击败BFS ?GG

如果很大,上的BFS 可能真的很慢,因为在计算到我们根本不在乎的虚拟节点的距离时会浪费太多时间。Dijkstra算法通过设置节点的估计距离并尽可能放松它们来避免这种情况。GË

第三,Dijkstra算法在未加权图上的表现如何?

它的行为与BFS完全相同。我们从两个主要方面进行阐述。

  • 关于“放松”。

    对于一般加权图上的Dijkstra算法,松弛为

    for all edges (u,v) in E:
        if dist(v) > dist(u) + w(u,v)
           dist(v) = dist(u) + w(u,v)
    

    对于非加权图上的BFS,我们知道和,因此松弛较为简单:d一世sŤv=wüv=1个

    for all edges (u,v) in E:
        if dist(v) = \infty
           dist(v) = dist(u) + 1
    
  • 在“优先队列”上。

    当Dijkstra算法在未加权图上运行时,优先级队列在任何时候最多包含两个不同的(距离)值。因此,BFS的FIFO队列就足够了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.