【学习新知】【算法】Strassen算法

Strassen 算法将矩阵乘法中的暴力方法(n^3)降到了 (n^2.81),把人们认为的不可能变为了可能。尤其令我震惊的是,仅仅是运用了矩阵的组合,分块以及不同元素的加减就形成了新的算法。很多伟大的发现都是仅仅源于很平常的东西。

再说说这个算法。

一,如果是2^k 阶相乘,

那么把A,B矩阵分成4块,每块是2^(n-1)阶。

然后创建十个矩阵,S1=B12-B22

S2 = A11+A12

S3=A21+A22

S4=B21-B11

S5=A11+A22

S6=B11+B22

S7=A12-A22

S8=B21+B22

S9=A11-A21

S10=B11+B12

再运算7次乘法(这比普通方法少了一次)

P1=A11*S1=A11*B11-A11*B22

P2=S2*B22=A11*B22+A12*B22

P3=S3*B11=A22*B21-A22*B11

P4=A22*S4=A22*B21-A22*B11

P5=S5*S6=A11*B11+A11*B22+A22*B11+A22*B22

P6=S7*S8=A12*B21+A12*B22-A22*B21-A22* B22

P7=S9*S10=A11*B11+A11*B12-A21*B11-A21*B22

之后,就可以得出A*B=C,将C分为4块后C11,C12,C21,C22的表达式。

C11=P5+P4-p2+p6

C12=P1+P2

C21=P3+P4

C22=P5+P1-P3-P7

然后用递归逐步求解,大功告成!

但是如果不是2^n阶矩阵呢?

没关系,如果它是方阵,那么就寻找离它阶数最近的2^n这个数,然后按照这2^n用strassen算法,其余暴力就好。(如果2^n大于原来的阶数,相当于添加了一些零元素)

同理,如果不是方阵,就把它补成方针,同理用0元素填补,在用以上方法解答。

 

再发个感慨,啊哈期末考试终于考完啦!先玩几天,再努力刷OJ啊!!!

posted on 2014-01-17 13:17  祥生  阅读(349)  评论(0编辑  收藏  举报

导航