【问题标题】:Counting source to destination path of k length计算 k 长度的源到目标路径
【发布时间】:2015-03-10 10:33:05
【问题描述】:

HERE作者讨论了三种方法来计算k长度的源到目标路径。我无法及时获得基于分而治之方法并声称为 O(V^3logk) 的最后一种方法。

我们也可以用分治法来解决上面的问题 O(V^3Logk) 时间。从 u 到 v 的长度为 k 的步行次数为 [u][v]'th entry in (graph[V][V])^k.我们可以通过做计​​算功率 O(Logk) 乘法通过使用分而治之技术来 计算功率。两个大小为 V x V 的矩阵之间的乘法 需要 O(V^3) 时间。因此该方法的总体时间复杂度为 O(V3Logk)。

特别是上面写着的那一行

从 u 到 v 的长度为 k 的步行计数是第 [u][v] 的条目 (图[V][V])^k

【问题讨论】:

    标签: algorithm graph divide-and-conquer


    【解决方案1】:

    如果您使用邻接矩阵来表示图形(假设为 M),则 M^k 是表示每对节点之间大小为 k 的路径数的矩阵。您可以使用 O(log k) 矩阵乘法计算 M^k(每次需要 O(V^3) 时间)。

    这是一种分而治之的算法,因为要计算 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
    

    【讨论】:

    • 谢谢。没有得到 - “您可以使用 O(log k) 矩阵乘法计算 M^k。” ?
    • 矩阵乘法是一种关联运算,您可以按任意顺序进行。您可以使用Exponentiation by Squaring 解决它。
    • 谢谢。只是最后一个问题。这里cpsc.ualr.edu/srini/DM/chapters/examples/ans5.3.2.html。 .从 7 到 2 的长度为 2 只有一条路径。F^3、F^4 中的 entry[7][2] 仍然是 1 吗?我在这里想念什么。如果 M^k 表示长度为 k 的路径数 .. entry[7][2] 在 F^3、F^4 等中应该为 0。
    • 该页面中的矩阵不是 F^3、F^4 等,它们只是 Warshal 算法的迭代。将答案中的示例更改为使用该矩阵进行计算。实际上有大小为 2、5、6、8 的路径,两条大小为 9 的路径,等等。
    猜你喜欢
    • 2021-06-18
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多