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
ANSWER:
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对括号。