[Algorithm] 4. Divide and Conquer

2023. 10. 11. 00:04Run/Algorithm

✔️ Divide and Conquer?

1) 전략

- 주어진 문제의 입력을 분할하여 문제를 해결하는 방식

- 분할한 입력에 대해 동일 알고리즘을 적용하여 해 계산, 이들의 해를 취합하여 원래 문제의 해 얻음

- 부분문제(subproblem): 분할된 입력에 대한 문제, 부분해: 부분문제의 해

- 부분문제는 더이상 분할할 수 없을 때까지 계속 분할

 

2) 과정

- 분할(divide): 해결되기 쉽도록 문제를 여러 개의 작은 부분으로 나눔

- 정복(conquer): 나눈 작은 문제를 반복하여 각각 해결 (Top-Down)

- 통합(combine): 해결된 작은 답들을 모아 원래 문제의 해답 구함 (Bottom-Up)

 

3) 종류

- Sorting: merge sort, quick sort

- Binary tree traversal

- Multiplication of larget integers (카라추바 알고리즘)

- Matrix multiplication (Strassen 알고리즘)

- Closest-pair algorithm

- Convex-hull algorithm


✔️ Sorting (Merge Sort & Quick Sort)

1) Merge Sort (합병 정렬)

1. 분할: n개의 숫자들을 n/2개씩 2개의 부분문제로 분할

2. 정복: 부분문제 해결 (sub-problem 정렬)

3. 통합: 정렬된 각 부분배열을 하나의 정렬된 배열로 재귀적으로 합병

2) Quick Sort (빠른 정렬)

- [Pivot보다 작은 수들] [Pivot] [Pivot보다 큰 수들]

- 분할된 부분문제들에 동일 과정 재귀적으로 수행하여 정렬


✔️ Binary Tree Traversal

1) Pre-order (Root, Left, Right)

F - B - A - D - C - E - G - I - H

 

2) In-order (Left, Root, Right)

A - B - C - D - E - F - G - H - I

 

3) Post-order (Left, Right, Root)

A - C - E - D - B - H - I - G - F

 

1. 분할: 왼쪽 subtree, 오른쪽 subtree

2. 정복: traversal (in-order traversal)

- 왼쪽 subtree traverse

- root 방문

- 오른쪽 subtree traverse

3. 통합: X


✔️ Karatsuba Algorithm

1) Multiplication of larget integers

- 큰 수에 대한 효과적인 곱셈 알고리즘 (일반적으로 수가 2^320 이상일 때 효과적임)

- 자릿수가 같은 두 수에 대한 알고리즘 (다르면 적용 불가)

- x, y: B진법의 n자리수 어떤 값

- 기본적으로 x * y 곱셈연산은 O(n^2) 연산 횟수 필요

- x, y의 곱을 자릿수가 x, y의 절반인 수들의 곱 3번과 덧셈, 시프트 연산 이용해 연산 횟수 줄임

 

2) Algorithm

- 일반적으로 x, y가 n자리수인 경우 m = n/2

- ex)

        48 * 53

        L = 20 / N = 24 / M = 20 + 24 - (4 - 8)(5 - 3) = 52

        xy = 20 * 10^2 + 52 * 10^1 + 24 = 2544

        → 3번의 곱셈


✔️ Strassen's Matrix Multiplication

1) Strassen's Matrix Multiplication

- 조건: 행렬 nxn이며 n은 2의 거듭제곱임

1. 분할: A, B 행렬 분할

2. 정복: M1 ~ M7 구하기 위해 재귀 호출

3. 통합: 최종값 C 구함

 

2) Formula

- A 행렬 가로 성분 불러오는 데 for문 1번, B 행렬 세로 성분 불러오는 데 for문 1번, 각 성분 불러오면서 for문 1번 (n^3)

- n 값이 조금만 늘어나더라도 계산량이 기하급수적으로 증가


✔️ Closest-Pair Algorithm

1) Closest-Pair Algorithm

- 2차원 평면상 n개의 점 주어질 때, 거리가 가장 가까운 한 쌍의 점 찾는 문제

- 점이 아주 많을 때 효과적임

1. 점들을 하나의 차원을 기준으로 정렬 (ex. x-axis 기준)

2. 점들을 분할

3. 분할한 곳 각각에서 가까운 한 쌍의 점 찾음

4. 그 중 최소값 찾음

 

- 가장 가까운 두 점이 서로 다른 영역에 있다면?

→ 우선 최소값을 찾고, 각 영역에서 최소값 이내에 근접 점이 있는지 확인

- 더 좋은 방법은 최소 단위로 쪼개 최소값이 trivial 하도록 하는 것!

 

2) Closest Pair by Divide & Conquer

1. 분할: x-coordinate 기준으로 반으로 나눔 (점들을 반으로 나누는 vertical line 찾기)

2. 정복: 재귀적으로 반으로 쪼개진 영역에서 closest pair을 찾음

3. 통합: 구한 최소값보다 더 가까이에 점이 위치해 있는지 확인

- 활용 분야: 컴퓨터 그래픽스, 컴퓨터 비전, 지리 정보 시스템, 분자 모델링, ...

 


✔️ Convex Hull

1) Convex Hull

- 최소 개수의 꼭짓점으로 이루어진 볼록 다각형을 만들어, 볼록 다각형 내부에 모든 점을 포함

- H is the smallest convex polygon that contains all the points of Q

1. y 좌표가 가장 작은 것을 기준점으로 선정

2. 이 기준점으로 하여 다른 점들을 반시계 방향으로 정렬

3. 조건을 만족하지 않는 경우 pop

 

2) Convex Hull with Divide & Conquer

1. 분할: 점들을 둘로 분할 (Qleft, Qright)

2. 정복: Qleft, Qright에 대해 문제 해결

3. 통합: Qleft, Qright의 convex hull들을 병합

 

3) Algorithm

1. 점들을 두 영역으로 나눔

2. 각 영역에서 convex hull 구함

3. 왼쪽에서는 가장 오른쪽에 있는 점, 오른쪽에서는 가장 왼쪽에 있는 점을 연결

4. 오목인지 볼록인지 따지고, 조건 만족하지 않으면 점을 버리고 다음 점 선택해 연결

'Run > Algorithm' 카테고리의 다른 글

[Algorithm] 3. Brute Force Algorithm  (0) 2023.10.11
[Algorithm] 2. 탐색과 정렬 알고리즘  (0) 2023.10.11
[Algorithm] 1. Data Structure 복습  (0) 2023.10.11
[Algorithm] 0. Introduction  (0) 2023.10.11
[Algorithm] 빅오(Big-O) 표기법  (0) 2023.10.11