【发布时间】: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的差异与分开的节点数无关