【问题标题】:Warshall algorithm idea and possible improvementWarshall 算法思想和可能的改进
【发布时间】:2019-06-01 16:12:48
【问题描述】:

Warshall 计算有向图传递闭包的算法通常采用以下形式(来自 Warshall algorithm idea and improvement):

ALGORITHM Warshall(A[1..n, 1..n])
    //ImplementsWarshall’s algorithm for computing the transitive closure
    //Input: The adjacency matrix A of a digraph with n vertices
    //Output: The transitive closure of the digraph
    R(0) ←A
    for k←1 to n do
        for i ←1 to n do
            for j ←1 to n do
                R(k)[i, j ]←R(k−1)[i, j ] or (R(k−1)[i, k] and R(k−1)[k, j])
    return R(n)

但是我们可以通过注意到如果 |i-j| 没有更新来加快上述实现。

我错过了什么吗?这种改进不会影响运行时间吗? (我还没有花时间计算那个版本的运行时间。)

【问题讨论】:

  • 取 i 和 j 的区别有什么意义?第 k 个矩阵包含在从 i 到 j 的途中涉及节点 1 .. k 的闭包。 k 与 i 和 j 之间的差异有什么关系?
  • @mangusta - k 的想法是,如果存在从 i 到 k 以及从 k 到 j 的路径,则存在从 i 到 j 的路径。如果 i 和 i 不是分开的 k 节点,那么这样的练习不会揭示任何有意义的东西。
  • i 和 j 只是一个节点 ID。节点ID的差异与分开的节点数无关

标签: algorithm graph-algorithm


【解决方案1】:

您缺少的是|i - j|ij 之间的距离无关。

Warshal 算法在迭代 k 中所做的是确定在 标记为 i 的顶点和 标记为 j 的顶点之间是否存在仅使用 {1, ..., k} 中的顶点作为中间体。因此,如果满足以下两个条件之一,R(k)[i,j] 应该等于 1:

  1. R(k-1)[i,j] = 1。也就是说,在顶点 i 和顶点 j 之间存在一条仅使用{1, ..., k-1} 中的顶点作为中间点的路径。
  2. R(k−1)[i, k] and R(k−1)[k, j]。即存在从顶点 i 到顶点 k 的路径,存在从顶点 k 到顶点 j 的路径,每个路径都只使用{1, ..., k-1} 中的顶点作为中间点。

ij(以及|i-j|)的值与顶点i 和顶点j 之间的距离无关。它们是用作顶点标识符的任意标签。

【讨论】:

  • @snakile - 我的理解有误。谢谢。顺便说一句,仍然有一种预感,我们可以做更多的优化。当我手动进行一些迭代时,感觉就像很多循环都没有任何更新。
  • @KGhatak 在这个算法中没有什么可以优化的。 i * j * k 检查中的每一次检查对于确定每个可能对 [ i , j ] 之间的所有闭包都是必要的
猜你喜欢
  • 2015-09-26
  • 1970-01-01
  • 2018-11-11
  • 1970-01-01
  • 2016-01-18
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多