矩阵链乘法的memoized版本

时间:2011-11-10 13:02:28

标签: algorithm dynamic-programming

以下是来自cormen等介绍的算法的记忆版矩阵链乘法程序

MEMOIZED-MATRIX-CHAIN(p)

1 n  length[p] - 1   
2 for i = 1 to n
3      do for j = i to n
4             do m[i, j]  = infinity   
5 return LOOKUP-CHAIN(p, 1, n)

LOOKUP-CHAIN(p, i, j)

1 if m[i,j] < infinity
2    then return m[i, j]
3 if i = j
4    then m[i, j]  0
5    else for k =  i to j - 1
6             do q = LOOKUP-CHAIN(p, i, k) +
                     LOOKUP-CHAIN(p, k + 1, j) +
                     p(i - 1)* p(k) *p(j) 
7                if q < m[i, j]
8                   then m[i, j] = q
9 return m[i, j]

在描述中提到我们可以将LOOKUP-CHAIN的调用分为两种类型:

  1. 调用m [i,j] =无穷大,以便执行第3-9行。
  2. 调用m [i,j]小于无穷大,以便LOOKUP-CHAIN只返回行
  3. 第一种类型的n个方形调用,每个表项一个。第二种类型的所有调用都是通过第一种类型的调用进行的递归调用。 每当LOOKUP-CHAIN的给定调用进行递归调用时,它就会产生“n”。因此,总共有n个多维数据集调用。每次打电话 第二种类型需要O(1)时间,第一种类型的每次调用需要O(n)时间加上递归调用中的花费。总时间是O(n立方体)。

    我的问题是

    1. 作者的意思是“第二种类型的所有呼叫都是通过第一种类型的呼叫进行递归呼叫”?
    2. 作者是如何提出的“LOOKUP-CHAIN的给定调用进行递归调用,它在上面的句子中使它们成为”n“?
    3. 谢谢!

1 个答案:

答案 0 :(得分:2)

  1. 我认为它们意味着如果考虑递归调用树,第二种类型的调用将显示为叶子(不再递归),而第一种类型的调用则是树的内部节点。所以是的,第二种类型是由第一种类型调用的。

  2. for第5行的LOOKUP-CHAIN循环最多执行n次迭代(因为1≤i≤j≤n),因此最多可以使2n = O(n)递归呼叫。

  3. 如果你将它描绘成一棵树,也许更容易理解这种递归算法的复杂性:

    • 内部节点对应“类型2”,它们不能超过n²(因为存储),并且它们各自执行O(n)操作

    • 叶子对应于“类型1”。因为最多n²个内部节点最多有2n个子节点,所以你不能有超过2n³的叶子,并且每个叶子都执行θ(1)操作