HERE作者讨论了三种计算k长度的源到目标路径的方法。我无法获得基于分而治之的方法的最后一种方法,并且声称是及时的O(V ^ 3logk)。
我们也可以使用Divide and Conquer来解决上述问题 O(V ^ 3Logk)时间。从u到v的长度k的步数是 [u] [v]进入(图[V] [V])^ k。我们可以通过做计算来计算能力 O(Logk)乘法使用分而治之技术 计算能力。两个大小为V x V的矩阵之间的乘法 需要O(V ^ 3)时间。因此,该方法的总时间复杂度是 O(V3Logk)。
特别是说
的行从u到v的长度为k的步数是[u] [v]'中的条目 (曲线图[V] [V])^ķ
答案 0 :(得分:1)
如果使用邻接矩阵来表示图形(让我们说M),则M ^ k是表示每对节点之间的大小为k的路径数的矩阵。您可以使用O(log k)矩阵乘法(每次采用O(V ^ 3)时间)计算M ^ k。
它是一种分而治之的算法,因为要计算M ^ k,你可以计算M' = M ^(k / 2)然后M ^ k = M' x M' (或者M' x M' x M,如果k不能被2整除)。
以下是O(log k)乘法中M ^ k计算的示例:
def matrix_mul(A, B):
return [[
sum(x * B[i][col] for i,x in enumerate(row)) for col in range(len(B[0]))
] for row in A]
def matrix_pow(M, k):
if k==1: return M
M2 = matrix_pow(M, k/2)
M2 = matrix_mul(M2, M2)
if k%2==1: M2 = matrix_mul(M2, M)
return M2
M = [[0,1,1,0,1,0,0,0],
[0,0,0,0,1,1,0,0],
[0,0,0,1,0,0,0,0],
[0,0,0,0,0,1,1,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,1,0,0,0],
[1,0,1,0,0,0,0,0],
[0,0,0,1,0,0,0,0]]
for i in range(1, 10):
print 'Paths from 7 to 2 of size', i, '=', matrix_pow(M, i)[6][1]
哪个输出:
Paths from 7 to 2 of size 1 = 0
Paths from 7 to 2 of size 2 = 1
Paths from 7 to 2 of size 3 = 0
Paths from 7 to 2 of size 4 = 0
Paths from 7 to 2 of size 5 = 1
Paths from 7 to 2 of size 6 = 1
Paths from 7 to 2 of size 7 = 0
Paths from 7 to 2 of size 8 = 1
Paths from 7 to 2 of size 9 = 2