<算法导论>练习4.2

4.2-1
就是代入书中的式子计算一下,令
A = [ 1 3 7 5 ] B = [ 6 8 4 2 ] A= \begin{bmatrix} 1&3 \\ 7&5 \end{bmatrix} B= \begin{bmatrix} 6&8 \\ 4&2 \end{bmatrix} A=[1735]B=[6482]
S 1 = B 12 − B 22 = 8 − 2 = 6 S_1=B_{12}-B_{22}=8-2=6 S1=B12B22=82=6
同理,S2=4,S3=12,S4=-2,S5=6,S6=8,S7=-2,S8=6,S9=-6,S10=14
再代入P的计算公式:
P 1 = A 11 ∗ S 1 = 1 ∗ 6 = 6 P_1=A_{11}*S_1=1*6=6 P1=A11S1=16=6
同理可得P2=8,P3=72,P4,=-10,P5=48,P6=-12,P7=-84
代入计算C的公式:
C 11 = P 5 + P 4 − P 2 + P 6 = 18 C_{11}=P_5+P_4-P_2+P_6=18 C11=P5+P4P2+P6=18
C 12 = 14 , C 21 = 62 , C 22 = 66 C_{12}=14,C_{21}=62,C_{22}=66 C12=14,C21=62,C22=66
这就是结果了。

4.2-2

伪代码如下所示:

Strassen(A,B):
	n=A.rows
	let C be a new n*n matrix
	let P be a new 1*7 matrix
	let S be a new 1*10 matrix
	if n==1:
		return A[1,1]*B[1,1]
	else:
		partion A,B and C as in equations(4.9)
		S[1]=B[1,2]-B[2,2]
		...
		S[10]=B[1,1]+B[1,2]
		P[1]=Strassen(A[1,1],S[1])
		...
		P[7]=Strassen(S[9],S[10])
		C11=P5+P4-P2+P6
		C12=P1+P2
		C21=P3+P4
		C22=P5+P1-P3-P7
	return C

4.2-3
通过补0的方式将其扩展为n*n即可,strassen的算法时间复杂度就是 Θ ( n l g 7 ) \Theta(n^{lg7}) Θ(nlg7)

4.2-4

题目意思是(4.9)不再按 n / 2 ∗ n / 2 n/2*n/2 n/2n/2这样来分矩阵,而是按照 n = 3 m n=3^m n=3m次幂,分成的子矩阵为 n / 3 ∗ n / 3 n/3*n/3 n/3n/3,按照式(4.17)可以写出这样分的递归式为:
T ( n ) = k ∗ T ( n / 3 ) + Θ ( n 2 ) T(n)=k*T(n/3)+\Theta(n^2) T(n)=kT(n/3)+Θ(n2)
用主方法解上述递归式为: Θ ( n log ⁡ 3 k ) \Theta(n^{\log_3k}) Θ(nlog3k),接下来解出满足如下方程的k即可:
log ⁡ 3 k < log ⁡ 2 7 \log_3k<\log_27 log3k<log27
解得k=21

4.2-5
由4.2-4中的递归式可知,时间复杂度为 Θ ( n log ⁡ x y ) \Theta(n^{\log_xy}) Θ(nlogxy)其中x是矩阵的维度,y是运算乘法次数,那么对于每种方法代入x和y可以计算他们的时间复杂:
log ⁡ 68 132464 , log ⁡ 70 143640 , log ⁡ 72 155424 \log_{68}132464,\log_{70}143640,\log_{72}155424 log68132464,log70143640,log72155424

4.2-6
原本两个复数的乘法计算需要四次实数乘法,通过类似strassen算法的思想,通过线性组合的方式可以减少一次乘法:
A = ( a + b ) ( c + d ) = a c + a d + b c + b d A=(a+b)(c+d)=ac+ad+bc+bd A=(a+b)(c+d)=ac+ad+bc+bd
A式中只有中间那项带括号的乘法是真正需要计算的,右边的那项只是说明A式与原始数据的关系。
B = a c , C = b d B=ac,C=bd B=ac,C=bd 均只需要一次乘法计算
最后的结果为:
( B − C ) + ( A − B − C ) i (B-C)+(A-B-C)i (BC)+(ABC)i

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值