시간 내에 정렬되지 않은 배열의 중앙값 찾기


45

정렬되지 않은 배열의 중앙값을 찾기 위해 요소에 대해 시간 의 최소 ​​힙을 만든 다음 요소를 하나씩 추출 하여 중간 값을 얻을 수 있습니다. 그러나이 방법은 시간이 걸립니다.N N / 2 O ( N 로그 N )영형(로그)/2영형(로그)

우리는 시간 에 어떤 방법으로도 똑같이 할 수 있습니까 ? 우리가 할 수 있다면 어떻게?영형()



1
@JukkaSuomela 왜 이것을 빠르고 간단하게 해보자 (이상적으로 그러한 알고리즘에 대한 간단한 설명과 함께)?
Raphael

2
관련된 메타 토론에 주목하십시오 . 결과적으로 간단한 웹 검색으로이 질문에 대한 답을 얻을 수 있습니다.
Raphael

답변:


45

이것은 선택 알고리즘 의 특별한 경우입니다. 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 ) 최악의 경우이다.영형()영형(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보다 작 으면 어떻게됩니까?
Jayesh

고정 된 n의 경우, 복잡하지 않은 한 복잡성은 일정하지 않습니다. 따라서 O (2 ^ n) 인 경우에도 이러한 특수한 경우에 대해 복잡한 복잡성을 가진 유효한 알고리즘을 사용할 수 있습니다. 고정 n의 경우 (즉, 최대 4 개의 경우) 복잡도는 최대 O (2 ^ 4) = O (1)입니다.
v6ak

3
첫 번째 알고리즘에서 : 알고리즘을 무질서하게 만들지 return A[k]않는 한 부정확 A합니다. 경우 split분할하는 일이 A되도록 k = |L| + 1를 Where 당신은 아직도 모르는 k번째 요소입니다. 기본 사례는 |A| = 1다른 두 가지 재귀 호출 중 하나를 수행해야하는 경우입니다 .
wcochran

2
@NickCaplinger는 web.archive.org를 사용하여 수정되었습니다
jmad

1
일반 선택 알고리즘 O (NlogN)의 최악의 경우가 아닙니까? 각 호출 후에 재귀 호출이 배열의 10 % 만
남더라도

6

1/4영형()

알고리즘의 주요 아이디어는 샘플링을 사용하는 것입니다. 우리는 배열의 정렬 된 순서로 서로 가까이 있고 그들 사이에 중앙값을 갖는 두 가지 요소를 찾아야합니다. 자세한 내용은 참조 [MU2017]를 참조하십시오.


[MU2017] Michael Mitzenmacher와 Eli Upfal. "확률 및 컴퓨팅 : 알고리즘 및 데이터 분석의 무작위 화 및 확률 기법", 3 장 57-62 페이지. Cambridge University Press, 2017 년 제 2 판.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.