Transcript Ch02-3
행렬의 개요
행렬은 수를 원소로 지니는 다차원 배열이다.
mn (“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
k1
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
분할정복을 사용하지 말아야 하는 경우