我正在尝试构建所有图算法的限制列表

时间:2010-04-09 12:16:53

标签: algorithm graph

Single Source shortest Path

Dijkstra - 指向和无向 - 仅适用于正边权重 - 周期??

贝尔曼福特指导 - 不存在循环

All source shortest path

Floyd Warshall - 没有信息

Minimum Spanning Tree 

(没有关于边缘权重或图形或周期性质的信息)

Kruskal的

Prim's - 无向

Baruvka的

2 个答案:

答案 0 :(得分:4)

我不确定问题是什么,但是这里......

Dijkstra算法的经典实现只能处理正边缘权重,但有一种方法可以使它与负边缘成本一起工作。每当更新节点时,将更新的节点放回队列中。然而,这是否真的是Dijkstra或具有优先级队列的Bellman-Ford是有争议的。

例如,请考虑此图表:

1 - 2(100)
2 - 3(-200)
1 - 3(50)
3 - 4(100)

经典Dijkstra将设置D [1] = 0,D [2] = 100,D [3] = 50,D [4] = 150,D [3] = -100并停止。但是,当设置D [3] = -100时,将3添加回队列并继续算法。这将得到D [4] = 0,这是正确的。我不确定这是否被认为是“Dijkstra算法”。

至于Bellman-Ford,图表不一定必须指向,并且(负成本周期,其他周期没有任何差别)周期可以存在,只需确保您检测周期。从队列中n次提取节点时会检测到一个循环,其中n是节点数。您可以执行相同的检查以检测上面概述的“修改后的Dijkstra算法”中的循环。

Floyd Warshall - 节点数量的成本是立方的。对于除了非常小的图之外的任何东西都不够。它假定没有负成本周期,但您可以使用它来检测此类周期,请参阅wikipedia

MST - 当边数接近O(n)而不是O(n 2 )时使用Kruskal。否则使用Prim。两者都适用于任何类型的图形,即使它们包含负边缘权重和周期。

我个人非常喜欢的另一种最短路径算法是Dial's algorithm。我喜欢把它想象成计算图表排序。另请阅读this rather exhaustive paper

答案 1 :(得分:1)

A *(A star)可能是图算法中的最佳选择之一。但是,如维基百科文章中所述:

  

A *的时间复杂度取决于启发式。在最坏的情况下,扩展的节点数在解的长度(最短路径)中是指数的,但是当搜索空间是树时它是多项式的

意味着根据图形计算的时间并不总是相同的。