如果节点被删除,如何在线重新计算所有对最短路径?

时间:2010-03-29 12:39:41

标签: algorithm graph

关于地下爆炸的最新消息让我对以下问题感到好奇。假设我们有一个加权无向图,其节点有时会被删除。问题是在这种删除之后快速重新计算所有节点对之间的最短路径。

通过对Floyd-Warshall algorithm的简单修改,我们可以计算出所有对之间的最短路径。这些路径可以存储在一个表中,其中shortest[i][j]包含ij之间最短路径上的下一个节点的索引(如果没有路径,则为NULL值)。该算法需要O(n³)时间来构建表,而每个查询shortest(i,j)需要O(1)。不幸的是,我们应该在每次删除后重新运行此算法。

另一种方法是对每个查询运行图搜索。这样每次删除都需要零时间来更新辅助结构(因为没有),但每个查询都需要O(E)时间。

当删除图表的节点时,可以使用什么算法来“平衡”查询并更新所有对最短路径问题的时间?

3 个答案:

答案 0 :(得分:1)

goran所述,您只需重新计算包含同时删除的节点的最短路径。所以,我会做以下事情:

  1. 使用Floyd-Warshall算法计算所有最短路径。这是O( n 3 )。
  2. 创建一个索引,将顶点索引分配给顶点参与的最短路径列表。(换句话说,对于每个顶点 i ,它会为您提供的列表(j, k)对st i 存在于顶点 j k 之间的最短路径中。这是O( n 2 d )(其中 d 是图形直径),因为你必须在每个最短的每个顶点上循环在上一步中确定的路径,并且 n 2 这样的最短路径。
  3. 删除顶点后,从步骤2中创建的索引中查找受影响的最短路径列表,然后重新计算它们。由于您不需要这里的所有最短路径,并且我假设只有少数节点受到影响,因此您可能最好使用多个广度优先搜索,即O( m + n )其中 m 是边数。

答案 1 :(得分:0)

好吧,如果删除一个节点,我认为你不需要重新运行整个构建。仅适用于那些包含节点的路径。

解决您的问题的简单方法是添加有关冗余路径的信息,例如,您可以为最短路径上的每个节点设置第二条最短路径。 这不会减少计算时间,但会缓存它(它还会将存储要求提高n倍,其中n是节点的平均数量,对于单个节点的移除,对于2节点的因子为n *(n-1)冗余...以及n!因子用于完全冗余,并且还通过相同因子增加初始构建时间,并且还增加了添加节点所需的时间)

如果有办法改善这一点并缩短重建时间,那么你需要找到一个允许快速计算最短距离的结构,但是当删除或添加节点时,该结构应该是不可变的(或重新计算的便宜)到图表。

答案 2 :(得分:0)

我将回答问题的隐含非泛型变体,其中图表是道路网络。在我看来,任意图形的理论界限不那么有趣的情况之一。

最短路径查找的一些最佳方法是公路节点路由和传输节点路由。 (在dissertation by Dominik Schultes中描述)。加速结构可以合理快速地构建(对于整个欧洲的HNR约15分钟)并且它支持增量更新。有趣的是,随机查询的查询时间约为1毫秒,所有对距离表的计算结果可低至每条目0.2us。更有趣的是查询性能缩放,数据表明缩放在图形大小中是亚对数/接近常数。在4.3us随机查询中,传输节点路由甚至更快。唉,我没有关于数据结构可更新性的任何信息。直观地说,增量更新不应该太难。

可以在类似于道路网络(稀疏,平面,分层)的其他图表上使用相同或类似的方法。