개인 공부/알고리즘
[알고리즘] 선택 알고리즘
KimNang
2023. 2. 10. 19:48
1. 평균 선형 시간 선택 알고리즘
- 퀵 정렬처럼 분할한 후 자기호출 방법을 쓰면 평균적으로 선형 시간에 i번째 작은 원소를 찾을 수 있음. 그렇지만 이 알고리즘은 최악의 경우 O(n²) 시간이 소요됨.
- 이번 알고리즘은 단점을 개선해서 최악의 경우에도 선형 시간에 i번째 작은 원소를 찾을 수 있게 함.
- n개의 원소가 규칙 없이 저장된 배열에서 i번째 작은 원소를 찾으려 함.
- 분할 알고리즘이 리턴하는 값으로 기준 원소가 전체에서 몇 번째 작은 원소인지 알 수 있음.
- 기준원소가 전체에서 k번째 작은 원소란 사실을 알면, i와 k의 값을 비교해서 작으면 왼쪽 그룹에 있는 원소 중 하나이고, 같으면 기준 원소가 바로 i번째 작은 수이고, 크면 i 번째 작은 수는 오른쪽 그룹에 있는 원소 중 하나임.
2번째 작은 원소를 찾는 예
7번째 작은 원소를 찾는 예
select(A, p, r, i )
{
if (p = r ) then return A[p];
q <- partition( A, p, r);
① k <- q-p + 1;
if ( i < k ) then return select ( A, p, q-1, i);
else if ( i = k ) then return A[q];
else return select(A, q+1, r, i-k);
}
- ①을 통해 기준원소가 전체에서 k번째 작은 원소. i와 k를 비교해서 각 그룹을 대상으로 자기호출 함.
이 알고리즘의 수행 시간
- 기준원소가 전체 집합에서 k번째 작은 원소이면 두 그룹은 각각 k-1개와 n-k개로 나뉨.
T(n) ≤ max[T(k-1),T(n-k)] + θ(n)
- 평균적인 경우 θ(n) 시간이 걸리지만 최악의 경우에는θ(n²)의 시간이 소요됨.
2. 최악의 경우에도 선형 시간을 보장하는 선택 알고리즘
linearSelect(A, p, r, i)
{
1. 원소의 총수가 5개 이하이면 i번째 원소를 찾고 알고리즘을 끝냄
2. 전체 원소를 5개씩의 원소를 가진 n/5개의 그룹으로 나눔.
3. 각 그룹에서 중앙값을 찾음.
4. 여러 중앙값을 재귀적으로 구함. 원소의 총수가 홀수면 중앙값이 하나, 짝수면 두개중 임의로 선택함.
5. 중앙값을 기준원소로 삼아 전체 원소를 분할함.
6. 분할된 두 그룹중 적합한 쪽을 선택해 재귀적으로 반복함.
}