我偶然与Bellman-Ford算法的著名日元的优化,我得到最初从Wikipedia,则我发现在练习部分几个教科书中相同的改进(例如,这是在Cormen一个问题24-1和Sedgewick的“算法”中的Web exercise N5。
以下是改进:
日元的第二次改进首先在所有顶点上分配一些任意线性顺序,然后将所有边的集合划分为两个子集。第一子集Ef包含所有边(vi,vj),使得i <1。焦耳;第二个Eb包含边(vi,vj),使得i>学家按照v1,v2,...,v | V |的顺序访问每个顶点,从Ef中的那个顶点放宽每个输出边缘。然后按照v | V |,v | V | -1,...,v1的顺序访问每个顶点,从Eb中的那个顶点放宽每个输出边缘。算法的主循环的每次迭代,在第一次迭代之后,将至少两个边缘添加到边缘集合,其宽松距离匹配正确的最短路径距离:一个来自Ef,一个来自Eb。这种修改从| V |减少了算法主循环的最坏情况迭代次数 - 1到| V | / 2。
不幸的是,我没有设法找到这个绑定| V | / 2的证明,而且,似乎我发现了一个反例。我确定我错了,但我看不清楚到底在哪里。
反例只是一个路径图,其顶点标记为1到n和初始顶点1.(因此,对于i,E = {(i,i + 1)}的范围从1到n-1)。在这种情况下,前向顶点集合等于E(E_f = E),后向顶点集合只是空集合。算法的每次迭代只增加一个正确计算的距离,因此算法在n-1时间内完成,这与提出的约束n / 2相矛盾。
我做错了什么?
UPD:所以这个错误非常愚蠢。我没有考虑通过顶点的迭代,考虑迭代直接更新路径成本。我没有删除这个主题,因为有人对它进行了投票,以防这种改进对某些人来说很有意思。
答案 0 :(得分:2)
这实际上是最好的情况,无论顶点的数量如何,都会在2次迭代中完成。
在纸上绘制迭代或编写代码。第一次迭代将找到所有正确的最短路径。然后第二次迭代不会改变任何东西,算法终止,因为最后一次迭代时距离改变的顶点集是空的。
“向前”穿过放松Ef边缘组的顶点将完成所有工作,而“向后”运行将不会做任何事情,因为Eb是空集。