算法导论15.2矩阵链乘法 练习总结

15.2-1 对矩阵规模序列<5,10,3,12,5,50,6>,求矩阵链最优括号化方案。

ANSWER:

def MATRIX_CHAIN_ORDER(p):
	n = len(p)
	s = [[0 for j in range(n)] for i in range(n)]
	m = [[0 for j in range(n)] for i in range(n)]
	for l in range(2, n):			#l is the chain length
		for i in range(1, n-l+1):
			j = i + l - 1
			m[i][j] = 1e9
			for k in range(i, j):
				q = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]
				if q < m[i][j]:
					m[i][j] = q
					s[i][j] = k
	print()
	PRINT_OPTIMAL_PARENS(s, 1, n-1)
	print()
	
def PRINT_OPTIMAL_PARENS(s, i, j):
	if i == j:
		print('A', end = '')
		print(i, end = '')
	else:
		print('(', end = '')
		PRINT_OPTIMAL_PARENS(s, i, s[i][j])
		PRINT_OPTIMAL_PARENS(s, s[i][j]+1, j)
		print(')', end = '')
		
A = [5, 10, 3, 12, 5, 50, 6]
MATRIX_CHAIN_ORDER(A)


15.2-2 设计递归算法MATRIX-CHAIN-MULTIPLY(A, s, i, j),实现矩阵链最优代驾乘法计算的真正计算过程,其输入参数为矩阵序列<A1, A2, ..., An>,MATRIX-CHAIN-ORDER得到的表s,以及下标 i 和 j。(初始调用应为MATRIX-CHAIN-MULITIPLY(A, s, 1, n)。)

ANSWER:

MATRIX-CHAIN-MULITIPLY(A, s, i, j):
    if i == j:
        return A[i]
    else:
        B1 = MATRIX-CHAIN-MULITIPLY(A, s, i, s[i][j])
        B2 = MATRIX-CHAIN-MULITIPLY(A, s, s[i][j]+1, j)
        return B1*B2

15.2-3 用代入法证明递归公式(15.6)的结果为Ω(2^n)。

ANSWER:

算法导论15.2矩阵链乘法 练习总结_第1张图片


15.2-5 令R(i,j)表示在一次调用 MATRIX-CHAIN-ORDER过程中,计算其他表项时访问表项m[i,j]的次数。证明:∑∑R(i,j)= (n^3 - n) / 3。

ANSWER:



15.2-6 证明:对n个元素的表达式进行完全括号花,恰好需要n-1对括号。

ANSWER:n个元素需要进行n-1次乘法操作,而每一次运算操作恰好在一对括号内,所以恰好有n-1对括号。

你可能感兴趣的:(算法,算法导论)