220 likes | 587 Views
행렬의 개요. 행렬은 수를 원소로 지니는 다차원 배열이다 . m n (“ m by n ”) 행렬은 m 개의 행과 n 개의 열을 갖는다 . 행과 열의 개수가 같은 n x n 행렬을 정방행렬 이라 한다 . 두 행렬이 같은 수의 행과 열을 가지며 각 위치의 해당 원소의 값이 같으면 “ 두 행렬은 같다 ”고 정의한다. 행렬의 곱. 행렬의 곱 :. 행렬곱셈 – 단순 알고리즘 (1/3). 문제 : n n 크기의 행렬의 곱을 구하시오 .
E N D
행렬의개요 • 행렬은 수를원소로 지니는 다차원 배열이다. • mn (“m by n”) 행렬은 m개의 행과 n개의 열을 갖는다. • 행과 열의 개수가 같은 nxn행렬을 정방행렬이라 한다. • 두 행렬이 같은 수의 행과 열을 가지며 각 위치의 해당 원소의 값이 같으면 “두 행렬은 같다”고 정의한다.
행렬의곱 • 행렬의 곱:
행렬곱셈 – 단순 알고리즘 (1/3) • 문제: n n크기의 행렬의 곱을 구하시오. • 입력: 양수 n, n n크기의 행렬 A와 B • 출력: 행렬 A와 B의 곱인 C • 알고리즘: 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]; } }
행렬곱셈 – 단순 알고리즘 (2/3) 곱셈 연산의 시간복잡도 분석 - I • 단위연산: 가장 안쪽의 루프에 있는 곱셈 연산 • 입력크기: 행과 열의 수, n • 모든 경우 시간복잡도 분석: 총 곱셈의 횟수는 다음과 같다.
행렬곱셈 – 단순 알고리즘 (3/3) 곱셈 연산의 시간복잡도 분석 – II (P. 86 연습문제 25번) • 단위연산: 가장 안쪽의 루프에 있는 덧셈(뺄셈) 연산 • 입력크기: 행과 열의 수, 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]; } }
쉬트라쎈(Strassen) 방법 – 2x2 행렬 (1/2) • 문제: 두 2 2 행렬 A와 B의 곱(product) C, • 쉬트라쎈(Strassen)의 해: Why? 앉아서 꼼꼼히 따져보세요.
쉬트라쎈(Strassen) 방법 – 2x2 행렬 (2/2) • 시간복잡도 분석: • 단순 곱셈 방법: 8번의 곱셈과 4번의 덧셈이 필요함 • 쉬트라쎈 방법: 7번의 곱셈과 18번의 덧셈/뺄셈이 필요함 • 언뜻 봐서는 전혀 좋아지지 않았다! • 그러나 행렬의 크기가 커지면 쉬트라쎈의 방법의 가치가 드러난다.
쉬트라쎈(Strassen) 방법 – nxn 행렬 (1/3) • 문제: n이 2의 거듭제곱이고, 각 행렬을 4개의 부분행렬(submatrix)로 나눈다고 가정하자. 두 n n행렬 A와 B의 곱 C: • 쉬트라센의 해
쉬트라쎈(Strassen) 방법 – nxn 행렬 (2/3) • 예 (수행과정의 일부 – M1구하기)
쉬트라쎈(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) // M2=… } returnC; } • Threshold? 쉬트라쎈 알고리즘보다 단순 알고리즘이 더 좋을 것이라 예상되는 지점
쉬트라쎈(Strassen) 방법의 분석 (1/7) 곱셈 연산에 대한 시간복잡도 분석 • 단위연산: 곱셈하는 연산 • 입력크기: 행과 열의 수, n • 1×1 행렬이 될 때까지 계속 분할한다고 가정. • threshold를 1이라고 가정 • 두 개의 1×1 행렬의 곱은 그 비용이 1이다. • [모든 경우 시간복잡도] 분석 • 점화식을 다음과 같이 구할 수 있다. • Why? 하나의 nxn곱셈이 일곱 개의 (n/2)x(n/2) 곱셈으로 바뀌었기 때문
쉬트라쎈(Strassen) 방법의 분석 (2/7) 곱셈 연산에 대한 시간복잡도 분석 (계속) • n=2k에 대해서 앞에서 구한 점화식을 전개하면 다음과 같다. • 상기 결과는 귀납법에 의해서 증명이 가능하다. (Skip!) • 또한, 상기 점화식은 Master Theorem 1번을 이용하면 간단히 해를 구할 수 있다. (See the next page)
쉬트라쎈(Strassen) 방법의 분석 (3/7) 곱셈 연산에 대한 시간복잡도 분석 (계속) • n=2k에 대해서 앞에서 구한 점화식의해를 Master Theorem 을 이용하여 구하기 f(n) = af(n/b) + cnd a=7, b=2, c=0, d=0
쉬트라쎈(Strassen) 방법의 분석 (4/7) 덧셈/뺄셈연산에대한 시간복잡도 분석 • 단위연산: 덧셈/뺄셈하는 연산 • 입력크기: 행과 열의 수, n • 모든 경우 시간복잡도 분석: 앞서와 마찬가지로 threshold를 1이라 한다. • 점화식을 다음과 같이 구할 수 있다. nxn곱셈이 일곱 개의 (n/2)x(n/2) 곱셈으로 바뀌었고, 18번의 (n/2)x(n/2) 행렬 덧셈/뺄셈이 필요한데, 각각은 (n/2)2번의 덧셈/뺄셈을 필요로 하기 때문 • Why?
쉬트라쎈(Strassen) 방법의 분석 (5/7) • 덧셈/뺄셈연산에대한 시간복잡도 분석 (계속) • 점화식은 다음과 같다. • 부록 B의 예제 B.20을 이용하면 다음과 같이 점화식의 해가 구해진다. • Master Theorem을 사용하면 상기 점화식의 해는 다음과 같이 구할 수 있다. f(n) = af(n/b) + cnd a=7, b=2, c=9/2, d=2
쉬트라쎈(Strassen) 방법의 분석 (6/7) 표 2.3 nxn행렬을곱하는 두 알고리즘의 비교 (p. 70)
쉬트라쎈(Strassen) 방법의 분석 (7/7) • Strassen은 행렬 곱셈의 복잡도를 에서 으로 낮추었다. • Shmuel Winograd는 덧셈과 뺄셈을 15회만 수행하면 되는 쉬트라센 알고리즘의 변형을 개발 • 이후에 Coppersmith와 Winograd는 곱셈의 복잡도를 까지 낮춘 알고리즘을 개발하였다. • 그렇다면, 과연 얼마까지 복잡도를 낮출 수 있을까? • 두 행렬을 곱하기 위한 문제에 대해서 시간복잡도가 이 되는 알고리즘을 만들어 낸 사람은 아무도 없다. • 게다가 그러한 알고리즘을 만들 수 없다고 증명한 사람도 아무도 없다.
Skip… • Chapter 2.6 • Chapter 2.7