티스토리 뷰
- 전형적인 분할정복 방법이 적용된 알고리즘
- 분할
- 배열을 동일한 크기의 두 개의 부분배열로 분할하고
- 입력 크기 n인 배열을 크기 n/2인 두 부분배열로 분할한다.
- 정복
- 각각의 부분배열을 순환적으로 정렬한 후
- 두 부분배열을 정렬한다.
- 결합
- 정렬된 두 부분배열을 합병하여 하나의 정렬된 배열을 만듦
- 정렬된 두 부분배열을 합병하여 하나의 정렬된 배열을 만든다.
- 분할
- 합병정렬 Merge()
Merge(B[], C[], n, m){
i=j=k=0;
while(i<n && j<m){
if(B[i] <= C[j]) A[k++] = B[i++];
else A[k++] = C[j++];
}
for(;i<n; i++) A[k++] = B[i];
for(;j<m; j++) A[k++] = C[j];
return A[0 .. n+m-1];
}
-
- 합병 함수 Merge() 수행시간
- Θ(n)
- 입력 데이터 개수 n만큼의 추가 저장 장소(B[]+C[])가 필요
- T(n) = 2T(n/2) + Θ(n)
- T(n) = O(nlogn)
- 합병 함수 Merge() 수행시간
- 선택문제
- n개의 원소가 임의의 순서로 저장된 배열 A[0 .. n-1] 에서 i번째로 작은 원소를 찾는 문제
- i=1 -> 최소값, ..., i=n/2 -> 중간값, ..., i=n -> 최대값
- 직관적인 방법
- 오름차순으로 정렬한 후 i번째 원소를 찾는 방법 -> O(nlogn)
- 최소값을 찾는 과정을 i 번 반복(i-1번째 까지는 최소값을 찾은 후 삭제) -> O(in)
- 최솟값 찾기
- 각 데이터를 하나씩 모두 비교하는 방법
- n개의 데이터에 대해서 적어도 (n-1)번 비교가 필요 -> O(n)
- 각 데이터를 하나씩 모두 비교하는 방법
- 최솟값과 최댓값 모두 찾기
- 방법1: 최솟값 찾은 후 최댓값 찾기
- n개의 데이터에서 최솟값을 찾는데 (n-1)번 비교 + (n-1)개의 데이터에서 최댓값을 찾는데 (n-2)번 비교
==> 2n-3번의 비교 : O(n)
- n개의 데이터에서 최솟값을 찾는데 (n-1)번 비교 + (n-1)개의 데이터에서 최댓값을 찾는데 (n-2)번 비교
- 방법2: 모든 원소를 두 개씩 짝을 이루어 동시에 최솟값/최댓값과 비교
- 방법1: 최솟값 찾은 후 최댓값 찾기
- i번째로 작은 원소 찾기
- 퀵정렬의 분할 함수 Partition()을 순환적으로 적용하는 방법
- i=p -> 피벗이 찾고자 하는 i번째 원소
- i<p -> 왼쪽 부분배열에 대해 순환적용
- i>p -> 오른쪽 부분배열에 대해 순환적용
- 분할
- 피벗을 기준으로 주어진 배열을 두 부분배열로 분할하고 i가 피벗의 인덱스 p와 같으면 피벗의 값을 반환하고 종료
- 정복
- 인덱스 i가 포함된 부분배열에 대해 알고리즘을 순환적으로 호출하여 적용
- 결합
- 필요없음
- 퀵정렬의 분할 함수 Partition()을 순환적으로 적용하는 방법
- 성능분석
- 최악의 경우 = 퀵정렬의 최악의 경우
- 분할함수 Partition()이 항상 하나의 부분배열만 생성하는 경우
- 오름차순을 정렬된 상태에서 최댓값(i=n)을 찾는 경우
- 분할함수를 호출할 때마다 피벗 인덱스는 1씩 증가
- Partition()를 O(n)번 호출 => O(n^2)
- 해결방법 -> 항상 일정한 비율의 두 부분배열로 분할 -> 최악의 경우에도 O(n)
- 평균적인 경우 -> O(n)
- 최선 O(n), 최악 O(n)
- 일정한 비율의 두 부분배열로 분할되도록 특정 성질을 만족하는 값을 피벗으로 선택
- 피벗 선택 방법
- 크기 n인 배열의 원소를 5개씩 묶어서 n/5개의 그룹을 만듦
- 5의 배수가 되지 않아 그룹을 형성하지 못한 채 남는 원소는 그대로 남겨둠
- 각 그룹에 대해서 중간값을 찾음
- n/5개의 중간값을 대상으로 다시 중간값을 찾음
- 크기 n인 배열의 원소를 5개씩 묶어서 n/5개의 그룹을 만듦
- 선택문제 알고리즘 분류 정리
- 퀵 정렬의 Partition() 이용 -> 최악 O(n^2), 평균 O(n)
- "중간값들의 중간값"이용 -> 최악 O(n), 평균 O(n)
- 최악의 경우 = 퀵정렬의 최악의 경우
- n개의 원소가 임의의 순서로 저장된 배열 A[0 .. n-1] 에서 i번째로 작은 원소를 찾는 문제
'algorithm' 카테고리의 다른 글
[algorithm] 전화번호 목록 (0) | 2021.04.03 |
---|---|
[algorithm] 완주하지 못한 선수 java (0) | 2021.04.03 |
[algorithm] 분할정복 알고리즘 (0) | 2021.03.26 |
[algorithm] 알고리즘의 기초 (0) | 2021.03.15 |
[algorithm] 자료구조와 알고리즘 (0) | 2021.03.10 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 인접리스트
- 퀵정렬
- 소프트웨어
- C
- 최단경로
- 세마포어
- 입출력장치
- C++
- 구조체
- stackframe
- Java
- 자료구조
- 동적프로그래밍
- server side rendering
- client side rendering
- 교착상태
- 배열
- 클래스
- react
- 병행프로세스
- 알고리즘
- 재귀함수
- 운영체제
- 인접행렬
- javascript
- dfs
- BFS
- 이진탐색
- Stack
- 스텍
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함