算法设计与分析_第2章_递归与分治2
算法之2章递归与分治

算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式:1、定义:直接或间接地调用自身的算法称为递归算法。
用函数自身给出定义的函数称为递归函数。
2、与分治法的关系:由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。
3、递推方程:(1)定义:设序列01,....na a a简记为{na},把n a与某些个()ia i n<联系起来的等式叫做关于该序列的递推方程。
(2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。
4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序5、优缺点:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。
缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。
二、递归算法改进:1、迭代法:(1)不断用递推方程的右部替代左部(2)每一次替换,随着n的降低在和式中多出一项(3)直到出现初值以后停止迭代(4)将初值代入并对和式求和(5)可用数学归纳法验证解的正确性2、举例:-----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1(1)1T n T nT=−+=()(1)1W n W n nW=−+−(1)=021n-23()2(1)12[2(2)1]12(2)21...2++2 (121)n n n T n T n T n T n T −−=−+=−++=−++==++=−(1)2 ()(1)1((n-2)+11)1(2)(2)(1)...(1)12...(2)(1)(1)/2W n W n n W n n W n n n W n n n n =−+−=−−+−=−+−+−==++++−+−=−3、换元迭代:(1)将对n 的递推式换成对其他变元k 的递推式 (2)对k 进行迭代(3)将解(关于k 的函数)转换成关于n 的函数4、举例:---------------二分归并排序---------------()2(/2)1W n W n n W =+−(1)=0(1)换元:假设2kn =,递推方程如下()2(/2)1W n W n n W =+−(1)=0 → 1(2)2(2)21k k k W W W−=+−(0)=0(2)迭代求解:12122222321332133212()2(2)212(2(2)21)212(2)22212(2)2*2212(2(2)21)2212(2)222212(2)3*2221...2(0)*2(22...21)22k k k k k k k k k k k k k k k k k k k k k k k k W n W W W W W W W W k k −−−−−−−+−+−−−=+−=+−+−=+−+−=+−−=+−+−−=+−+−−=+−−−==+−++++=−1log 1n n n +=−+(3)解的正确性—归纳验证: 证明递推方程的解是()(1)/2W n n n =−()(1)1W n W n n W =−+−(1)=0,(n 1)=n +n=n(n-1)/2+n =n[(n-1)/2+1]=n(n+1)/2n W W +方法:数学归纳法证 n=1,W(1)=1*(1-1)/2=0假设对于解满足方程,则()---------------快速排序--------------------->>>平均工作量:假设首元素排好序在每个位置是等概率的112()()()(1)0n i T n T i O n n T −==+=∑ >>>对于高阶方程应该先化简,然后迭代(1)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
算法设计与分析第2章

计算F(n-1)所需 乘法次数 计算F(n-1) ×n所需 乘法次数
初始条件(initial condition):停止递归调用的条件 T(0) = 0
• Conquer: 一个划分确定后,A[s]的位置便确定,再 对两个子数组递归地划分 • Combine: 原地排序in-place sort,无需合并
Quicksort(A[l…r]) if l < r s = Partition(A[l…r]) Quicksort(A[l…s-1]) Quicksort(A[s+1…r]) Partition(A[l…r]) p = A[l] //选择第一个元素作为划分基准 i = l; j = r + 1 repeat repeat i = i + 1 until A[i] ≥ p //left-to-right scan repeat j = j - 1 until A[j] ≤ p //right-to-left scan swap(A[i], A[j]) until i ≥ j swap(A[i], A[j]) //undo last swap when i ≥ j swap(A[l], A[j]) return j
二分搜索(Binary Search)
• 给定已按升序排好序的n个元素A[0…n-1],现要在 这n个元素中找出一特定元素k。
– 蛮力算法:遍历、 Tworst(n) =O(n) – 分治法是否适用?
• • • •
算法设计与分析 递归与分治策略

9
2.1 递归的概念
例4 排列问题
递归算法生成n个元素{r1,r2,…,rn}的全排列。 设R={r1,r2,…,rn}是要进行排列的n个元素, Ri=R-{ri}。去掉元素ri。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列 前加上前缀得到的排列。 R的全排列可归纳定义如下:板
3
计划授课时间:6~8课时
2.1 递归的概念
直接或间接地调用自身的算法称为递归算法 用函数自身给出定义的函数称为递归函数(板) 使用递归技术使算法的描述简洁、易理解。 在实时系统或嵌入系统开发中,建议不使用 递归算法 下面来看几个实例。
4
2.1 递归的概念
例1 阶乘函数(板) 可递归地定义为:高低 1 n0 其中: n! n(n 1)! n 0 n=0时,n!=1为结束条件 n>0时,n!=n(n-1)!为递归方程 结束条件也称为边界条件,这二者是递归函 数的二个要素。 T=1; //递归结束条件为循环初值 递归为递推 for (i=2;i<n+1;i++){T=T*i;} 循环低高
算法设计与分析
第二章 递归与分治策略Fra bibliotek杨圣洪
学习要点: 理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。 (1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法; (4)棋盘覆盖; (5)合并排序和快速排序; (6)线性时间选择; (7)最接近点对问题; (8)循环赛日程表。
[工学]算法设计与分析第二章
![[工学]算法设计与分析第二章](https://img.taocdn.com/s3/m/c3999dcd5ef7ba0d4a733b29.png)
递归复杂性的一般形式
• 一般的,递归复杂性可描述为递归方程: 1 n=1 f(n) = af(n ~ b) + D(n) n>1 • 其中,a是子问题个数, ~表示递减方式, b是递减步长, D(n)是合成子问题的开销。 • 通常,递归元的递减方式~有两种: 分治法 1、除法,即n / b,的形式; 递推法 2、减法,即n – b,的形式。
第二章
递归与分治
2018/11/20
计算机算法设计与分析
1
递归的思想
• 递归(Recursion)就是通过把复杂问题分解为 较简单的同一问题来求解。 • 递归求解问题的方法通常有两步: • 第一步是考虑最简单的情况下该问题如何 求解。 • 第二步是考虑该问题的较复杂情况是如何 由较简单的所构成的。 • 由此得出该问题求解的方法。
2018/11/20 计算机算法设计与分析 28
分治法的基本思想
• 将一个规模为n的问题分解为a个规模较小的 子问题,这些子问题互相独立并且与原问题 相同。 • 递归地求解这些子问题问题。 • 然后将各个子问题的解合并在一起,从而得 到原问题的解。 • 影响其时间复杂性的因素是子问题的个数和 合并开销函数,其中较大者起主要作用。
A B C
2018/11/20
计算机算法设计与分析
4
Hanoi塔问题
• 让我们先考虑最简单的情况: • 1、若没有盘子(n=0),自然不需要做任何事情。 • 2、若只有一个盘子,也很容易。直接把它移到B 盘即可。
• 不妨设操作Move(X, Y) 将X柱上的一个盘子(最 顶上的)移到Y柱上。
A B C
GCD(x, y) = y, x, GCD(x – y, y), GCD(x, y – x), x=0 y = 0 最简单 x y 的情况 x < y 有两种
算法分析与设计 分 治 法

A ( n ))
I1
I2
如果MAX1和MIN1是I1中的最大和最小 元素,MAX2和 MIN2是I2中的最大和最小元 素, MAX1和MAX2中的大者就是I中的最大元 素MAX, MIN1和不需要 作任何分割直接就可得到其解。
3 3 2
2
迭代i次后 T (n) = 3 T ( n / 4 ) + 3
i i i −1
n / 4 + ... + 3n / 4 + n
i −1 i −1
当n / 4i +1 = 0,(2)不再是递归方程,这 时: T (n) = 3 n / 4 + 3
i i i −1
如果假定所分成的两个问题的输入规模大致相等, 则分治法总的计算时间可用下面的递归关系来表示:
g (n) T (n) = 2T ( n / 2 ) + f ( n )
其中,T(n)是输入规模为n的分治算法时间,g(n)是 对足够小的输入规模能直接计算出答案的时间, f(n)是合并的时间。
递归方程的形式多种多样,求其解的渐近阶的方 法也多种多样。比较实用的有以下五种方法:
I1
I2 I
procedure MERGESORT(low,high) global A[1..n] if low<high then mid← (low+high)/2 //求这个集合的分割点// { MERGESORT(low,mid) //将一个子集合排序// MERGESORT(mid+1,high) //将另一个子集合排序 MERGE(low,mid,high) //归并两个已排序的子集合// } end
算法设计与分析:递归与分治法-实验报告(总8页)

算法设计与分析:递归与分治法-实验报告(总8页)实验目的:掌握递归与分治法的基本思想和应用,学会设计和实现递归算法和分治算法,能够分析和评价算法的时间复杂度和空间复杂度。
实验内容:1.递归算法的设计与实现3.算法的时间复杂度和空间复杂度分析实验步骤:1)递归定义:一个函数或过程,在其定义或实现中,直接或间接地调用自身的方法,被成为递归。
递归算法是一种控制结构,它包含了解决问题的基础情境,也包含了递归处理的情境。
2)递归特点:递归算法具有以下特点:①依赖于递归问题的部分解被划分为若干较小的部分。
②问题的规模可以通过递推式递减,最终递归终止。
③当问题的规模足够小时,可以直接求解。
3)递归实现步骤:①确定函数的定义②确定递归终止条件③确定递归调用的过程4)经典实例:斐波那契数列递推式:f(n) = f(n-1) + f(n-2)int fib(int n) {if (n <= 0)return 0;else}5)优化递归算法:避免重复计算例如,上述斐波那契数列的递归算法会重复计算一些中间结果,影响效率。
可以使用动态规划技术,将算法改为非递归形式。
int f1 = 0, f2 = 1;for (int i = 2; i <= n; i++) {f1 = f2;使用循环避免递归,重复计算可以大大减少,提高效率。
1)分治算法的定义:将原问题分解成若干个规模较小且类似的子问题,递归求解子问题,然后合并各子问题得到原问题的解。
2)分治算法流程:②将问题分解成若干个规模较小的子问题。
③递归地解决各子问题。
④将各子问题的解合并成原问题的解。
3)分治算法实例:归并排序归并排序是一种基于分治思想的经典排序算法。
排序流程:②分别对各子数组递归进行归并排序。
③将已经排序好的各子数组合并成最终的排序结果。
实现源代码:void mergeSort(int* arr, int left, int right) {if (left >= right)while (i <= mid && j <= right)temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];temp[k++] = arr[i++];1) 时间复杂度的概念:指完成算法所需的计算次数或操作次数。
算法之2章递归与分治

算法分析(第二章):递归与分治法一、递归的概念知识再现:等比数列求和公式:1、定义:直接或间接地调用自身的算法称为递归算法。
用函数自身给出定义的函数称为递归函数。
2、与分治法的关系:由分治法产生的子问题往往是原问题的较小模式,这就为使用递归技术提供了方便。
在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小,最终使子问题缩小到很容易直接求出其解。
这自然导致递归过程的产生。
分治与递归经常同时应用在算法设计之中,并由此产生许多高效算法。
3、递推方程:(1)定义:设序列01,....na a a简记为{na},把n a与某些个()ia i n<联系起来的等式叫做关于该序列的递推方程。
(2)求解:给定关于序列{n a}的递推方程和若干初值,计算n a。
4、应用:阶乘函数、Fibonacci数列、Hanoi塔问题、插入排序5、优缺点:优点:结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,因此它为设计算法、调试程序带来很大方便。
缺点:递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多。
二、递归算法改进:1、迭代法:(1)不断用递推方程的右部替代左部(2)每一次替换,随着n的降低在和式中多出一项(3)直到出现初值以后停止迭代(4)将初值代入并对和式求和(5)可用数学归纳法验证解的正确性2、举例:-----------Hanoi塔算法----------- ---------------插入排序算法----------- ()2(1)1(1)1T n T nT=−+=()(1)1W n W n nW=−+−(1)=021n-23()2(1)12[2(2)1]12(2)21...2++2 (121)n n n T n T n T n T n T −−=−+=−++=−++==++=−(1)2 ()(1)1((n-2)+11)1(2)(2)(1)...(1)12...(2)(1)(1)/2W n W n n W n n W n n n W n n n n =−+−=−−+−=−+−+−==++++−+−=−3、换元迭代:(1)将对n 的递推式换成对其他变元k 的递推式 (2)对k 进行迭代(3)将解(关于k 的函数)转换成关于n 的函数4、举例:---------------二分归并排序---------------()2(/2)1W n W n n W =+−(1)=0(1)换元:假设2kn =,递推方程如下()2(/2)1W n W n n W =+−(1)=0 → 1(2)2(2)21k k k W W W−=+−(0)=0(2)迭代求解:12122222321332133212()2(2)212(2(2)21)212(2)22212(2)2*2212(2(2)21)2212(2)222212(2)3*2221...2(0)*2(22...21)22k k k k k k k k k k k k k k k k k k k k k k k k W n W W W W W W W W k k −−−−−−−+−+−−−=+−=+−+−=+−+−=+−−=+−+−−=+−+−−=+−−−==+−++++=−1log 1n n n +=−+(3)解的正确性—归纳验证: 证明递推方程的解是()(1)/2W n n n =−()(1)1W n W n n W =−+−(1)=0,(n 1)=n +n=n(n-1)/2+n =n[(n-1)/2+1]=n(n+1)/2n W W +方法:数学归纳法证 n=1,W(1)=1*(1-1)/2=0假设对于解满足方程,则()---------------快速排序--------------------->>>平均工作量:假设首元素排好序在每个位置是等概率的112()()()(1)0n i T n T i O n n T −==+=∑ >>>对于高阶方程应该先化简,然后迭代(1)差消化简:利用两个方程相减,将右边的项尽可能消去,以达到降阶的目的。
第2章 递归与分治策略优秀课件

以Rk( c ) 记放k个车的不同放法,令R0( c ) = 1 上面的棋盘C的棋盘多项式等于:
R( c )=1+n2x+
(
n
2
)2x2
+……+
(
n
r
)2
+n!xn
但是,我们经常碰到的是不完整的棋盘,这类棋盘 称残缺棋盘。
R( )= 1+X
R(
R ( ) = R ( ) = 1+2X R(
1 2 3 45
a
b c
d
e
(1+3X+X2) (1+4X+3X2)
正交的相乘
R(C)= (1+3X+X2)*(1+4X+3X2) = 1+7X+16X2+13X3+3X4
对照得到: B(0)= 5!- 7*4!+16*3!-13*2!+3*1!+ 0
= 25
这是简单的棋盘多项式能解决的问题,如果 有不正交的情况,我们主要采用下面的方法 进行构造。
) = 1+3X+X2 ) = 1+2X+X2 = (1+X)2
R ( ) = 1+4X+2X2
R(
) = 1+6X+7X2+X3
下面我们看一些应用: example: 在a,b,c,d,e的全排列中,要求a不出现在 第1和第5位,b不出现在第2和第3位,c不出现在 第3和第4位,e不出现在第5位,问:满足这些要 求的全排列有多少?
设所有元素互不相同。在这种情况下,找 出的基准x至少比3(n-5)/10个元素大,因为在 每一组中有2个元素小于本组的中位数,而 n/5个中位数中又有(n-5)/10个小于基准x。同 理,基准x也至少比3(n-5)/10个元素小。而当 n≥75时,3(n-5)/10≥n/4所以按此基准划分所 得的2个子数组的长度都至少缩短1/4。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
T(n)=T(n/4)+2 =T(n/8)+8 =… =T(n/2i)+i n/2i=1时终止分解,有 T(n)=T(1)+log2n =O(log2n)
14
二分搜索技术
输入:非降序排列的n个元素数组a, x; 输出: x所在位置; int BinarySearch(Type a[], const Type& x, int l, int r){ while (r >= l){ 算法复杂度分析: int m = (l+r)/2; 每执行一次while循环, 待 if (x == a[m]) return m; 搜索数组的大小减少一半。 if (x < a[m]) r = m-1; 在最坏情况下,while循环被 else l = m+1; 执行了O(lgn) 次。循环体内 } 运算需要O(1) 时间,因此在 最坏情况下的计算时间复杂 return -1; 15 性为O(lgn) 。 }
平衡(balancing)子问题思想
实践中发现,分治法设计算法时最好使子问题的规 模大致相同。即将一个问题分成大小相等的k个子 问题的处理方法是行之有效的。 几乎总是比子问题规模不等的做法要好。
5
分治法的复杂性分析
divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 }
若x=a[mid],则x在L中的位置就是mid; 如果x<a[mid],由于a是递增排序的,只要在a[mid]的前面查找x; 如果x>a[i],同理只要在a[mid]的后面查找x即可。
无论是在前面还是后面查找x,其方法都和在a中查找x一样, 只不过是查找的规模缩小了。这说明此问题满足分治法的 第二个和第三个适用条件。 10
二分搜索技术
问题:给定已按升序排好序的n个元素a[0:n-1],现要在 这n个元素中找出一特定元素x。 分析:
该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
分析: 很显然此问题分解出的子问题相互独立,即在a[i]的前面 或后面查找x是独立的子问题,因此满足分治法的第四 个适用条件。
基本操作时间
设分解阈值n0=1,且adhoc解规模为1的问题耗费1个单位时间。
分:将规模为n的问题分成k个规模为n/m的子问题。 设将原问题divide为k个子问题以及用merge将k个子问 题的解合并为原问题的解需用f(n)个单位时间。
6
分治法的复杂性分析
divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 }
19
Strassen矩阵乘法
传统方法:O(n3) 分治法:
复杂度分析
C11 C12 A11 A12 B11 B12 C B C A A B 22 22 21 3 22 21 21 T(n)=O(n )
Complexity analysis: Totally, 8 multiplications (subproblems), and 4 additions (n/2×n/2×4). T(1)=1, T(n) = 8T( n/2 )+n2. Applying Master Theorem, we have T(n)= O(n3).
注意:
递归方程及其解只给出n等于m的方幂时T(n)的值, 但是如果认为T(n)足够平滑,那么由n等于m的方幂 时T(n)的值可以估计T(n)的增长速度。 通常假定T(n)是单调上升的,从而当mi≤n<mi+1时, T(mi)≤T(n)<T(mi+1)。
8
二分搜索技术
问题:给定已按升序排好序的n个元素a[0:n-1],现要在 这n个元素中找出一特定元素x。 分析: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
分析:如果n=1即只有一个元素,则只要比较这个元素和x就 可以确定x是否在表中。因此这个问题满足分治法的第一个适 用条件 9
二分搜索技术
问题:给定已按升序排好序的n个元素a[0:n-1],现要在 这n个元素中找出一特定元素x。 分析:
分析:比较x和a的中间元素a[mid]
该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 分解出的子问题的解可以合并为原问题的解; 分解出的各个子问题是相互独立的。
给定已按升序排好序的n个元素a[0:n-1], 现要在这n个元素中找出一特定元素x。
Strassen矩阵乘法
A和B的乘积矩阵C中的元素C[i,j]定义为:
传统方法:O(n3)
若依此定义来计算A和B的乘积矩阵C,则每计 算C的一个元素C[i][j],需要做n次乘法和n-1次 加法。因此,算出矩阵C的 n2个元素所需的计算 时间为O(n3)
16
Strassen矩阵乘法
two n×n matrices A and B, Complexity(C=A×B) = ? 传统方法 ........ . .. .......... .......*.. n ........ c .. ***** .......*.. ij cij aik bkj ........ . .. .......... .......*.. k 1 ........ . .. .......... .......*..
2
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
选择分治 法必要条 件,有1.2缺 3条件则选 贪心算法 或动态规 划。
可解性:该问题的规模缩小到一定的程度就可以容 易地解决; 递归性:该问题可以分解为若干个规模较小的相同 问题,即该问题具有最优子结构性质 合并性:利用该问题分解出的子问题的解可以合并 为该问题的解; 独立性:该问题所分解出的各个子问题是相互独立 的,即子问题之间不包含公共的子问题。
算法设计与分析
第2章 递归与分治策略 (2)
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
应用前提, 此特征反 映了递归 思想的应 用
可解性:该问题的规模缩小到一定的程度就可以容 易地解决; 递归性:该问题可以分解为若干个规模较小的相同 问题,即该问题具有最优子结构性质 合并性:利用该问题分解出的子问题的解可以合并 为该问题的解; 独立性:该问题所分解出的各个子问题是相互独立 的,即子问题之间不包含公共的子问题。
3
分治法的适用条件
分治法所能解决的问题一般具有以下几个特征:
可解性:该问题的规模缩小到一定的程度就可以容 易地解决; 递归性:该问题可以分解为若干个规模较小的相同 问题,即该问题具有最优子结构性质 合并性:利用该问题分解出的子问题的解可以合并 为该问题的解; 独立性:该问题所分解出的各个子问题是相互独立 的,即子问题之间不包含公共的子问题。
这条特征涉及到分治法的效率,如果各子问题是不独立的, 则分治法要做许多不必要的工作,重复地解公共的子问题, 此时虽然也可用分治法,但一般用动态规划较好。
4
分治法的基本步骤
divide-and-conquer(P) { if ( | P | <= n0) adhoc(P); //解决小规模的问题 divide P into smaller subinstances P1,P2,...,Pk;//分解问题 for (i=1,i<=k,i++) yi=divide-and-conquer(Pi); //递归的解各子问题 return merge(y1,...,yk); //将各子问题的解合并为原问题的解 }
用T(n)表示该分治法解规模为|P|=n的问题所需的计算 时间,则) n 1 T ( n) kT (n / m) f (n) n 1
通过迭代法求得方程的解:
T ( n)
logm k n
logm n 1 j 0
k j f (n / m j )
A11 A12 A= ,B= A 21 A 22
B11 B12 , C = B B 21 22
C11 C12 C C 21 22
两个n/2×n/2矩阵 之间的加法
C11=A11B11+A12B21, C12=A11B12+A12B22 C21=A21B11+A22B21, C22=A21B12+A22B22