선형대수학에서 슈트라센 알고리즘은 독일의 수학자 폴커 슈트라센(Volker Strassen)이 1969년에 개발한 행렬 곱셈 알고리즘이다. 정의에 따라 n×n 크기의 두 행렬을 곱하면 O(n3)의 시간이 소요되지만 이 알고리즘은 대략 O(n2.807)의 시간이 소요된다.
알고리즘
- 일반적인 행렬의 곱셈
일반적으로 행렬의 곱셈은 A(ixj) , B(kxl) 일 때 AxB 행렬의 크기는 AxB(ixl)이 된다. 이 글에서는 스트라센 알고리즘을 위해 정방행렬을 사용할 것이다.
우리가 일반적으로 사용하는 행렬의 곱셉이다. nxn 크기의 정사각 행렬을 곱하면 총 n2번의 곱셈과 (n-1)n2번의 덧셈을 한다. O(n3)의 시간이 소요된다.
publicclassMain { publicvoidname() { /* 두 행렬 a, b */ int[][] a = { { 1, 2 }, { 3, 4 } }; int[][] b = { { 1, 2, }, { 3, 4 } };
/* 결과값 행렬 c */ intsize=2; int[][] c = newint[size][size];
/* 두 행렬의 곱셈 */ for (inti=0; i < size; i++) { for (intj=0; j < size; j++) { for (inth=0; h < size; h++) {
c[i][j] += a[i][h] * b[h][j]; } } } /* 값이 나온 각각의 값을 출력 */ for (inti=0; i < size; i++) { for (intj=0; j < size; j++) { System.out.println(c[i][j] + ""); }
} }
/* Main */ publicstaticvoidmain(String[] args) { /* 실행 */ Mainm=newMain(); m.name(); } }
- Strassen Algorithm
스트라센 알고리즘에서 행렬의 곱셉을 더하기 연산으로 분할하여 각 원소를 구할 수 있는 M행렬로 표현한다.