Aby znaleźć medianę nieposortowanej tablicy, możemy wykonać min-stos w czasie dla n elementów, a następnie możemy wyodrębnić jeden po drugim n / 2 elementów, aby uzyskać medianę. Ale takie podejście zająłoby czas O ( n log n ) .
Czy możemy zrobić to samo za pomocą jakiejś metody w czasie ? Jeśli możemy, to jak?
Odpowiedzi:
Jest to szczególny przypadek algorytmu selekcji, który może znaleźć ty najmniejszy element tablicy za pomocą kk k czyli połowę wielkości tablicy. W najgorszym przypadku istnieje implementacja liniowa.
Ogólny algorytm selekcji
Najpierw zobaczmy algorytm,k
find-kth
który znajduje ty najmniejszy element tablicy:Funkcja
split(A, pivot)
zwracaL,R
tak, że wszystkie elementyR
są większe niżpivot
iL
wszystkie inne (minus jedno wystąpieniepivot
). Następnie wszystko odbywa się rekurencyjnie.Jest to w średniej, ale O ( N 2 ), w najgorszym przypadku.O ( n ) O ( n2))
Najgorszy przypadek liniowy: algorytm mediany median
Lepszym punktem obrotu jest mediana wszystkich median podtablic o
A
rozmiarze 5, poprzez wywołanie procedury na tablicy tych median.To gwarantuje we wszystkich przypadkach. To nie jest takie oczywiste. Te slajdy PowerPoint są pomocne zarówno w wyjaśnieniu algorytmu, jak i złożoności.O ( n )
Zauważ, że przez większość czasu korzystanie z losowego obrotu jest szybsze.
źródło
5
standardowy? Co jeśli rozmiar A jest mniejszy niż 5?return A[k]
jest niepoprawny (chyba żeA
jest posortowany, co spowodowałoby, że algorytm byłby dyskusyjny). Jeślisplit
zdarzyło Ci się podzielićA
tak,k = |L| + 1
że nadal nie wiesz, gdzie jest tenk
element. Podstawowym przypadkiem jest sytuacja, gdy|A| = 1
jeszcze trzeba wykonać jedno z dwóch połączeń rekurencyjnych.Główną ideą algorytmu jest wykorzystanie próbkowania. Musimy znaleźć dwa elementy, które są blisko siebie w posortowanej kolejności tablicy i które mają medianę między nimi. Pełna dokumentacja znajduje się w odnośniku [MU2017].
[MU2017] Michael Mitzenmacher i Eli Upfal. „Prawdopodobieństwo i obliczenia: randomizacja i techniki probabilistyczne w algorytmach i analizie danych”, rozdział 3, strony 57–62. Cambridge University Press, drugie wydanie, 2017 r.
źródło