利用记忆分析NxN矩阵中最重路径的时间复杂度

时间:2012-10-12 20:23:29

标签: algorithm time-complexity dynamic-programming

下面的算法(伪代码)的时间复杂度是多少?我很难分析它。它是另一个线程指定的问题的实现:Algorithm to find max cost path of length N in matrix, from [0,0] to last row。但是因为我是新来的,我没有足够的分数在线程中评论(我认为)?这是我的第一篇文章,请原谅我,如果我做错了什么。

该算法使用cache[][][][]的记忆。在初始化期间cache[][][][]填充-1。

使用maxPath(0,0,m,DOWN)调用该方法。其中m是要采取的步数,n< = m< = n ^ 2,方向定义为DOWN = 0,LEFT = 1,RIGHT = 2.

function maxPath(i, j, fuel, direction)
    if i = n OR j = n OR j < 0 OR fuel = 0 then
         return 0;
    end if
    if cache[i][j][f-1][d] != -1 then
         return cache[i][j][f - 1][d];
    end if
    ret := 0
    acc+ = matrix[i][j]
    ret:=max(ret,maxPath(i+1, j, fuel-1, DOWN))
    if f > n - i then . If there is enough steps to move horizontally
        if d = RIGHT or d = DOWN then
            ret:=max(ret,maxPath(i, j+1, fuel-1, RIGHT))
        end if
        if d = LEFT or d = DOWN then
            ret:=max(ret,maxPath(i, j-1, fuel-1, LEFT))
        end if
    end if
    return cache[i,j,fuel-1,direction] = ret + matrix[i][j]
end function

1 个答案:

答案 0 :(得分:1)

Okey我已经解决了它,并且认为我应该分享我的结果。

如果我们让G =(V,E)是一个图,其中V = {maxPath(i,j,p,d):对于所有可能的i,j,p和d}和E = {uv:u = f(i,j,p,d)和v = f(i',j',p',d')}。我们有G是状态图,它显然是DAG(有向无环图)。然后,我们可以使用memoization计算maxPath。

我们有

    n possible values for i
    n possible values for j
    m possible values for fuel (which in worst case is n^2)
    3 possible values for direction

然后我们调用maxPath的n * n * m * 3个不同函数,在最坏的情况下是n ^ 4 * 3。所以,我们有O(n ^ 4)个不同的函数。每次调用函数都在O(1)时间运行。因为图形具有次优结构,所以每个子问题都是原始问题。因此,通过memoization,我们不必两次计算相同的“函数”,因此我们得到O(n ^ 4)。