Transcript Ch02-3

행렬의 개요
 행렬은 수를 원소로 지니는 다차원 배열이다.
 mn (“m by n”) 행렬은 m개의 행과 n개의 열을 갖는다.
 
A  ai, j
 a1,1 a1,2
a
a 2 ,2
2,1


 


am,1 am,2
 a1,n 
 a2,n 


 

 am,n 
 행과 열의 개수가 같은 nxn 행렬을 정방행렬이라 한다.
 두 행렬이 같은 수의 행과 열을 가지며 각 위치의 해당 원소의 값이 같으면
“두 행렬은 같다”고 정의한다.
 3 2   3 2  3 2 0 
 1 6     1 6    1 6 0 

 
 

Page 1
행렬의 곱
k

 행렬의 곱: AB  C  ci, j    ai, b, j


 1

 a1,1
a
 2 ,1


 ai ,1


 am ,1
a1,2
a2 ,2
ai ,2
am ,1
...
...
a1,k 
a2 ,k  b1,1
 b2 ,1

... ai ,k  
 bk ,1

... am ,k 
b1,2
b2 ,2
... b1, j
... b2 , j
bk ,2
... bk , j
... b1,n   c1,1
... b2 ,n   c 2 ,1

 
 
... bk ,n  cm ,1
c1,2
c 2 ,2
cm ,2
...
...
ci , j
...
c1,n 
c 2 ,n 


cm ,n 
0  1 1 0 
0 1  1 
1 0  5  1

2 0 3  2 0  2 0   3  2 11 3 

 1 0



3
1


Page 2
행렬곱셈 – 단순 알고리즘 (1/3)
 문제: n  n 크기의 행렬의 곱을 구하시오.
 입력: 양수 n, n  n 크기의 행렬 A와 B
 출력: 행렬 A와 B의 곱인 C
 알고리즘:
n



AB  C  ci , j    ai ,k bk , j 
 k1

void matrixmul (int n,
number[][] A, number[][] B,
number[][] C){
index i, j, k;
}
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++) {
C[i][j] = 0;
for (k = 1; k <= n; k++)
C[i][j]=C[i][j] + A[i][k]*B[k][j];
}
Page 3
행렬곱셈 – 단순 알고리즘 (2/3)
곱셈 연산의 시간복잡도 분석 - I
 단위연산: 가장 안쪽의 루프에 있는 곱셈 연산
 입력크기: 행과 열의 수, n
 모든 경우 시간복잡도 분석: 총 곱셈의 횟수는 다음과 같다.
3
3
T (n)  n  n  n  n (n )
Page 4
행렬곱셈 – 단순 알고리즘 (3/3)
곱셈 연산의 시간복잡도 분석 – II (P. 86 연습문제 25번)
 단위연산: 가장 안쪽의 루프에 있는 덧셈(뺄셈) 연산
 입력크기: 행과 열의 수, n
 모든 경우 시간복잡도 분석: 아래와 같이 약간만 알고리즘을 변경하면
총 덧셈의 횟수는 다음과 같다.
3
2
3
T (n)  (n  1) n  n  n  n (n )
…
}
for (i = 1; i <= n; i++)
for (j = 1; j <= n; j++) {
C[i][j] = A[i][1]*B[1][j];
for (k = 2; k <= n; k++)
C[i][j]=C[i][j]+A[i][k]*B[k][j];
}
Page 5
쉬트라쎈(Strassen) 방법 – 2x2 행렬 (1/2)
 문제: 두 2  2 행렬 A와 B의 곱(product) C,
c11
c
 21
c12   a11


c 22   a21
a12  b11


a22  b21
b12 
b22 
m1  ( a11  a22 )  (b11  b22 )

 쉬트라쎈(Strassen)의 해:
m2  ( a21  a22 )  b11
m3  a11  (b12  b22 )
m3  m5
m1  m4  m5  m7


C

where
m4  a22  (b21  b11 )
m

m
m

m

m

m
2
4
1
3
2
6


m  ( a  a )  b
11
12
22
 5
m6  ( a21  a11 )  (b11  b12 )

m7  ( a12  a22 )  (b21  b22 )
Why?
앉아서 꼼꼼히 따져보세요.
Page 6
쉬트라쎈(Strassen) 방법 – 2x2 행렬 (2/2)
 시간복잡도 분석:
• 단순 곱셈 방법: 8번의 곱셈과 4번의 덧셈이 필요함
• 쉬트라쎈 방법: 7번의 곱셈과 18번의 덧셈/뺄셈이 필요함
 언뜻 봐서는 전혀 좋아지지 않았다!
 그러나 행렬의 크기가 커지면 쉬트라쎈의 방법의 가치가 드러난다.
Page 7
쉬트라쎈(Strassen) 방법 – nxn 행렬 (1/3)
 문제: n이 2의 거듭제곱이고, 각 행렬을 4개의 부분행렬(submatrix)로
나눈다고 가정하자. 두 n  n 행렬 A와 B의 곱 C:
Page 8
쉬트라쎈(Strassen) 방법 – nxn 행렬 (1/3)
 쉬트라쎈(Strassen)의 해:
 M 1  M 4  M 5  M7
C
M2  M 4

 M1  ( A11  A22 )  ( B11  B22 )

 M 2  ( A21  A22 )  B11
 M 3  A11  ( B12  B22 )
M3  M5


where
 M 4  A22  ( B21  B11 )
M1  M3  M2  M6 
M  ( A  A ) B
11
12
22
 5
 M6  ( A21  A11 )  ( B11  B12 )

 M7  ( A12  A22 )  ( B21  B22 )
Page 9
쉬트라쎈(Strassen) 방법 – nxn 행렬 (2/3)
 예 (수행과정의 일부 – M1 구하기)
Page 10
쉬트라쎈(Strassen) 방법 – nxn 행렬 (3/3)
 문제: n이 2의 거듭제곱일 때, n  n 크기의 두 행렬의 곱을 구하시오.
 입력: 정수 n, n  n 크기의 행렬 A와 B
 출력: 행렬 A와 B의 곱인 C
 알고리즘:
nxn_matrix strassen(int n, nxn matrix A, nxn matrix B){
if (n <= threshold)
단순한 알고리즘을 사용하여 C = A * B를 계산;
else {
A를 4개의 부분행렬 A11, A12, A21, A22로 분할;
B를 4개의 부분행렬 B11, B12, B21, B22로 분할;
쉬트라쎈의 방법을 사용하여 C = A * B를 계산;
// C 계산시에 다음과 같은 재귀 호출 사용:
// M1=strassen(n/2, A11+A22, B11+B22)
}
return C;
}
 Threshold? 쉬트라쎈 알고리즘보다 단순 알고리즘이 더 좋을 것이라 예상되는 지점
쉬트라쎈(Strassen) 방법의 분석 (1/7)
곱셈 연산에 대한 시간복잡도 분석
 단위연산: 곱셈하는 연산
 입력크기: 행과 열의 수, n
 1×1 행렬이 될 때까지 계속 분할한다고 가정.
•
두 개의 1×1 행렬의 곱은 그 비용이 1이다.
•
threshold를 1이라고 가정
 [모든 경우 시간복잡도] 분석
 점화식을 다음과 같이 구할 수 있다. T (n)  7T ( n2 ) n  1이고, n  2 k ( k  1)
T (1)  1
 Why? 하나의 nxn 곱셈이 일곱 개의 (n/2)x(n/2) 곱셈으로 바뀌었기 때문
Page 12
쉬트라쎈(Strassen) 방법의 분석 (2/7)
곱셈 연산에 대한 시간복잡도 분석 (계속)
 n=2k에 대해서 앞에서 구한 점화식을 전개하면 다음과 같다.
T (n)  7  7 
 7 ( k times)
 7k
 7 lg n
 n lg 7
 n 2.81
(n 2.81 )
 상기 결과는 귀납법에 의해서 증명이 가능하다. (Skip!)
 또한, 상기 점화식은 Master Theorem 1번을 이용하면 간단히 해를 구할
수 있다. (See the next page)
Page 13
쉬트라쎈(Strassen) 방법의 분석 (3/7)
곱셈 연산에 대한 시간복잡도 분석 (계속)
 n=2k에 대해서 앞에서 구한 점화식의 해를 Master Theorem 을 이용하여
구하기
T (n)  7T ( n2 ) n  1이고, n  2 k ( k  1)
T (1)  1
f(n) = af(n/b) + cnd
a=7, b=2, c=0, d=0
Page 14
쉬트라쎈(Strassen) 방법의 분석 (4/7)
덧셈/뺄셈 연산에 대한 시간복잡도 분석
 단위연산: 덧셈/뺄셈하는 연산
 입력크기: 행과 열의 수, n
 모든 경우 시간복잡도 분석: 앞서와 마찬가지로 threshold를 1이라 한다.
 점화식을 다음과 같이 구할 수 있다.
T (n)  7T ( n2 )  18( n2 )2 n  1  n  2 k ( k  1)
T (1)  0
nxn 곱셈이 일곱 개의 (n/2)x(n/2) 곱셈으로 바뀌었고,
 Why? 18번의 (n/2)x(n/2) 행렬 덧셈/뺄셈이 필요한데,
각각은 (n/2)2 번의 덧셈/뺄셈을 필요로 하기 때문
Page 15
쉬트라쎈(Strassen) 방법의 분석 (5/7)
덧셈/뺄셈 연산에 대한 시간복잡도 분석 (계속)
2
k
 점화식은 다음과 같다. T (n)  7T ( n2 )  18( n2 ) n  1  n  2 ( k  1)
T (1)  0
 부록 B의 예제 B.20을 이용하면 다음과 같이 점화식의 해가 구해진다.
 Master Theorem을 사용하면 상기 점화식의 해는 다음과 같이 구할 수
있다.
f(n) = af(n/b) + cnd
a=7, b=2, c=9/2, d=2
Page 16
쉬트라쎈(Strassen) 방법의 분석 (6/7)
표 2.3 nxn 행렬을 곱하는 두 알고리즘의 비교 (p. 70)
단위 연산
곱셈
덧셈/뺄셈
표준 알고리즘
n3
n3 - n2
쉬트라센 알고리즘
n2.81
6n2.81 - 6n2
Page 17
쉬트라쎈(Strassen) 방법의 분석 (7/7)
2.81
3
 Strassen은 행렬 곱셈의 복잡도를 ( n )에서 (n )으로 낮추었다.
 Shmuel Winograd는 덧셈과 뺄셈을 15회만 수행하면 되는 쉬트라센 알
고리즘의 변형을 개발
 이후에 Coppersmith와 Winograd는 곱셈의 복잡도를 (n
알고리즘을 개발하였다.
2.38
)까지 낮춘
 그렇다면, 과연 얼마까지 복잡도를 낮출 수 있을까?
 두 행렬을 곱하기 위한 문제에 대해서 시간복잡도가 ( n 2 ) 이 되는 알고
리즘을 만들어 낸 사람은 아무도 없다.
 게다가 그러한 알고리즘을 만들 수 없다고 증명한 사람도 아무도 없다.
Skip…
 Chapter 2.6
 Chapter 2.7
분할정복을 사용하지 말아야 하는 경우