정렬되지 않은 배열의 중앙값을 찾기 위해 요소에 대해 시간 의 최소 힙을 만든 다음 요소를 하나씩 추출 하여 중간 값을 얻을 수 있습니다. 그러나이 방법은 시간이 걸립니다.N N / 2 O ( N 로그 N )
우리는 시간 에 어떤 방법으로도 똑같이 할 수 있습니까 ? 우리가 할 수 있다면 어떻게?
정렬되지 않은 배열의 중앙값을 찾기 위해 요소에 대해 시간 의 최소 힙을 만든 다음 요소를 하나씩 추출 하여 중간 값을 얻을 수 있습니다. 그러나이 방법은 시간이 걸립니다.N N / 2 O ( N 로그 N )
우리는 시간 에 어떤 방법으로도 똑같이 할 수 있습니까 ? 우리가 할 수 있다면 어떻게?
답변:
이것은 선택 알고리즘 의 특별한 경우입니다. k 는 배열 크기의 절반 인 배열 에서 번째로 작은 요소를 찾을 수 있습니다 . 최악의 경우 선형 구현이 있습니다.
먼저 배열 find-kth
에서 번째로 작은 요소 를 찾는 알고리즘 을 살펴 보겠습니다 .
find-kth(A, k)
pivot = random element of A
(L, R) = split(A, pivot)
if k = |L|+1, return pivot
if k ≤ |L| , return find-kth(L, k)
if k > |L|+1, return find-kth(R, k-(|L|+1))
함수 split(A, pivot)
반환 L,R
모든 요소가되도록 R
보다 많은 pivot
그리고 L
모든 다른 (마이너스의 일 명 발생 pivot
). 그런 다음 모든 것이 재귀 적으로 수행됩니다.
이은 의 평균 그러나에서 O ( N 2 ) 최악의 경우이다.
더 나은 피벗은 A
이러한 중간 배열에서 프로 시저를 호출하여 크기가 5 인 하위 배열의 모든 중간 배열의 중간입니다.
find-kth(A, k)
B = [median(A[1], .., A[5]), median(A[6], .., A[10]), ..]
pivot = find-kth(B, |B|/2)
...
이것은 모든 경우에 를 보장 합니다. 그렇게 분명하지 않습니다. 이 파워 포인트 슬라이드 는 알고리즘과 복잡성을 설명하는 데 도움이됩니다.
임의 피벗을 사용하는 대부분의 시간이 더 빠릅니다.
5
표준입니까? A의 크기가 5보다 작 으면 어떻게됩니까?
return A[k]
않는 한 부정확 A
합니다. 경우 split
분할하는 일이 A
되도록 k = |L| + 1
를 Where 당신은 아직도 모르는 k
번째 요소입니다. 기본 사례는 |A| = 1
다른 두 가지 재귀 호출 중 하나를 수행해야하는 경우입니다 .