선택(Selection) 문제
선택 문제: n개의 숫자들 중에서 k번째로 작은 숫자를 찾는 문제
간단한 방법
- 최소 숫자를 찾고 제거하는 과정을 k번 반복하고 최소 숫자를 찾는다 ~ 최악의 경우 O(kn)
- 숫자들을 정렬하고 k번째 숫자를 찾는다 ~ 최악의 경우 O(nlogn)
선택 문제 알고리즘
* 각 그룹의 크기를 알면, k번째 작은 숫자가 어느 그룹에 있는지 알 수 있고, 그 그룹에서 몇 번째 작은 숫자를 찾아야 하는지 알 수 있다!
- Small group에 k번째 작은 숫자가 속한 경우: k번째 작은 숫자를 해당 그룹에서 찾는다
- Large group에 k번째 작은 숫자가 속한 경우: (k – Small group의 숫자 개수 – 1) 번째로 작은 숫자를 해당 그룹에서 찾는다
선택 문제 알고리즘 과정
선택 문제 알고리즘 고려사항
- 피봇을 랜덤하게 정하기 때문에 분할 정복 알고리즘인 동시에 랜덤 알고리즘이다
- 피봇이 너무 작거나 큰 값으로 선정되는 경우 알고리즘의 수행 시간이 길어진다
* good 분할 확률과 bad 분할 확률은 각각 1/2로 동일하다!
선택 문제 알고리즘 시간복잡도
평균 경우 시간 복잡도(= good 분할이 1/2 = 2 * 전부 good 분할인 경우 시간복잡도)
= 2 * O[n + 3/4*n + (3/4)^2*n … (3/4)^i*n] = 2 * O(n) = O(n)
이진탐색 알고리즘과 비교
- 범위를 1/2씩 좁혀가는 방식과 피봇으로 분할하는 방식의 차이가 있다
- 부분문제를 취합하는 과정이 별도로 필요 없다는 공통점을 가진다
선택 문제 알고리즘 응용
데이터 분석을 위해 중앙값(median)을 찾을 때 활용 (평균값보다 중앙값이 의미 있을 경우 多)
최근접 점의 쌍(Closest Pair) 문제
최근접 점의 쌍 문제: 2차원 평면상의 n개의 점이 입력으로 주어질 때, 거리가 가장 가까운 한 쌍의 점을 찾는 문제
간단한 방법
- 모든 점에 대하여 각각의 두 점 사이의 거리를 계산해 가장 가까운 점의 쌍을 찾는다
- 전체 점에서 2개 조합의 개수 n(n-1)/2를 모두 계산하는 시간 복잡도 O(n^2)
최근접 점의 쌍 분할 정복 알고리즘
최근접 점의 쌍 분할 정복 알고리즘 과정
최근접 점의 쌍 분할 정복 알고리즘 시간복잡도
- 전처리 과정으로 S의 점을 x좌표 기준으로 정렬 ~ O(nlogn)
- S의 점이 3개라면 3번, 1개라면 1번 거리를 계산 ~ O(1)
- S를 분할하는 경우 이미 정렬된 배열의 중간 인덱스로 분할 ~ O(1)
- S(L)과 S(R)에 대해서 재귀 호출하는 과정은 합병 정렬과 동일
- 중간 영역 최소 거리를 구할 때, y좌표로 정렬 ~ O(nlogn), 주변 점과 비교 ~ O(1)
- 3개의 점의 쌍 중에 가장 짧은 거리를 가진 값 반환 ~ O(1)
- 해를 취합하여 올라가는 과정 ~ O(nlogn)
- k층까지 분할된 후 층 별로 수행되는 과정 = 각 층의 수행 시간 * 층 수 = O(nlogn) * logn = O(nlog^2*n)
최근접 점의 쌍 분할 정복 알고리즘 응용
- 컴퓨터 그래픽스
- 컴퓨터 비전(Vision)
- 지리 정보 시스템(GIS)
- 분자 모델링(Molecular Modeling)
- 항공 트래픽 조정(Air Traffic Control)
- 마케팅(주유소, 프랜차이즈 신규 가맹점 등 위치 선정)
'Computer Science > Algorithm' 카테고리의 다른 글
[HUFS/알고리즘] #5 그리디 알고리즘(2) (0) | 2022.04.11 |
---|---|
[HUFS/알고리즘] #4 그리디 알고리즘(1) (0) | 2022.04.04 |
[HUFS/알고리즘] #2 분할 정복 알고리즘(1) (0) | 2022.03.21 |
[HUFS/알고리즘] #1 알고리즘과 시간 복잡도 (1) | 2022.03.14 |
[HUFS/자료구조] #10 그래프 (2) | 2021.12.09 |