以下是来自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的调用分为两种类型:
第一种类型的n个方形调用,每个表项一个。第二种类型的所有调用都是通过第一种类型的调用进行的递归调用。 每当LOOKUP-CHAIN的给定调用进行递归调用时,它就会产生“n”。因此,总共有n个多维数据集调用。每次打电话 第二种类型需要O(1)时间,第一种类型的每次调用需要O(n)时间加上递归调用中的花费。总时间是O(n立方体)。
我的问题是
谢谢!
答案 0 :(得分:2)
我认为它们意味着如果考虑递归调用树,第二种类型的调用将显示为叶子(不再递归),而第一种类型的调用则是树的内部节点。所以是的,第二种类型是由第一种类型调用的。
for
第5行的LOOKUP-CHAIN
循环最多执行n次迭代(因为1≤i≤j≤n),因此最多可以使2n = O(n)递归呼叫。
如果你将它描绘成一棵树,也许更容易理解这种递归算法的复杂性:
内部节点对应“类型2”,它们不能超过n²(因为存储),并且它们各自执行O(n)操作
叶子对应于“类型1”。因为最多n²个内部节点最多有2n个子节点,所以你不能有超过2n³的叶子,并且每个叶子都执行θ(1)操作