Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如果一条边的权重减小,则更新最短路径距离矩阵_Algorithm_Graph Theory_Path Finding_Shortest Path - Fatal编程技术网

Algorithm 如果一条边的权重减小,则更新最短路径距离矩阵

Algorithm 如果一条边的权重减小,则更新最短路径距离矩阵,algorithm,graph-theory,path-finding,shortest-path,Algorithm,Graph Theory,Path Finding,Shortest Path,给出了一个加权图G及其最短路径距离矩阵delta。所以delta(i,j)表示从i到j的最短路径的权重(i和j是图的两个顶点)。 delta最初包含最短路径的值。边缘E的重量突然从W减小到W'。如何更新O(n^2)中的增量(i,j)?(n=图形的顶点数) 问题不是再次计算具有最佳O(n^3)复杂度的所有对最短路径。问题是更新delta,这样我们就不需要重新计算所有对最短路径 更清楚:我们只有一个图和它的delta矩阵。增量矩阵只包含最短路径的值。现在我们想根据图中的一个变化来更新增量矩阵:减少边

给出了一个加权图G及其最短路径距离矩阵delta。所以delta(i,j)表示从i到j的最短路径的权重(i和j是图的两个顶点)。 delta最初包含最短路径的值。边缘E的重量突然从W减小到W'。如何更新O(n^2)中的增量(i,j)?(n=图形的顶点数) 问题不是再次计算具有最佳O(n^3)复杂度的所有对最短路径。问题是更新delta,这样我们就不需要重新计算所有对最短路径


更清楚:我们只有一个图和它的delta矩阵。增量矩阵只包含最短路径的值。现在我们想根据图中的一个变化来更新增量矩阵:减少边权重。如何在O(n^2)中更新它?

阅读Dijkstra的算法。这就是你如何解决这些最短路径问题,并且在不到O(n^2)的时间内运行

编辑这里有一些微妙之处。这听起来像是提供了从图中任意i到任意j的最短路径,听起来像是需要更新整个矩阵。在该矩阵上迭代是n^2,因为该矩阵是每隔一个节点的每个节点,或者是n*n或n^2。简单地对delta矩阵中的每个条目重新运行Dijkstra算法不会改变这个性能等级,因为n^2大于Dijkstra的O(| E |+| V | log | V |)性能。我是正确地阅读了这篇文章,还是我记错了大O


EDIT-EDIT看起来我记错了big-O。在矩阵上迭代将是n^2,而Dijkstra在每个矩阵上的迭代将是额外的开销。我不知道如何在一般情况下做到这一点,而不知道哪些路径W'包含在。。。这似乎意味着应该检查每一对。因此,您需要在固定时间内更新每一对,或者避免检查数组的重要部分。

如果从节点a到节点b的边E的权重减小,则我们可以在固定时间内更新从节点i到节点j的最短路径长度。从i到j的新最短路径要么与旧路径相同,要么包含从a到b的边。如果它包含从a到b的边,那么它的长度是
delta(i,a)+边(a,b)+delta(b,j)

由此看来,更新整个矩阵的O(n^2)算法很简单,处理无向图的算法也很简单。

虽然两者都考虑增减。增加会使情况更加困难。 然而,在第一个例子中,第973页第3节,他们解释了如何只减少n*n


不,动态全对最短路径可以在不到nnn的时间内完成。我想维基百科不是最新的;)

什么是n?边或顶点的数量?您的措辞可以改进。矩阵是δ,矩阵的一个元素是δ(i,j)。有趣的问题。我很确定没有比重新运行Floyd Warshall更快的解决方案了,它是O(n^3),但我无法证明。Dijkstra给出了单源最短路径。是的,Dijkstra可以用来在不到O(n^2)的时间内更新矩阵的一行(如果图是无向的,则更新一列)。但是要更新整个矩阵,它比O(n^2)更糟糕。好吧,问题不是使用dijkstra并得到O(n^2)的单源最短路径。我们想要计算所有对最短路径(保存在delta(i,j)中),而计算整个delta的最佳方法是O(n^3){在CLRS}中声明。在这里,我们想根据一条边的变化来更新增量(而不是再次完全重新计算)。@Robert做的事情(大致)是n logn,n^2倍,成本是O(n^3 logn),而不是O(n^2)。否则,你可以做一些花费O(n!),n倍于O(n)@桑吉特,@chris-绝对。我在你发帖的时候编辑了我的问题,后来又更新了@帕萨同意。但由于不知道最短路径的组成部分,因此无法知道(我可以想到)矩阵的哪些组成部分必须更新。如果你做了,这将是一个简单的减法。除非我严重误读了这个问题,否则我们不知道最短路径的组成部分。要更新路径W'的增量,我们需要知道它们。除非我们能在固定时间内做到这一点,否则我们已经打破了我们的界限。我真的不明白你说的话。我们只有delta矩阵,它只包含表示最短路径长度的值。你怎么知道边E以前是否在i到j的最短路径中?你只有一个数字,让我再次澄清这个问题:我们只有一个图和它的delta矩阵。增量矩阵只包含最短路径的值。现在我们想根据图中的一个变化来更新增量矩阵:减少边权重。如何在O(n^2)中更新它?有什么建议吗?我重新措辞了我的问题,并进一步澄清了它。罗伯特:看来克里斯是对的。我们不需要知道前面的最短路径是否包含边E。我们计算新的最短路径,如果它的值小于之前的delta(i,j),我们用新的更新它@克里斯:使用delta(a,i)和delta(j,b)会不会有问题?我自己现在觉得你的解决方案没有错,但我认为这个问题比这个更难;)你们都同意Chris的上述解决方案是正确的吗?(再次强调上述方法不需要了解之前的路径)