Algorytm magicznych piątek

Z testwiki
Przejdź do nawigacji Przejdź do wyszukiwania

Algorytm magicznych piątek, algorytm Bluma-Floyda-Pratta-Rivesta-Tarjana (ang. median of medians) – algorytm rozwiązujący problem selekcji, czyli znalezienia k-tej co do wielkości spośród n liczb. Zaproponowali go Blum, Floyd, Pratt, Rivest i Tarjan w roku 1973. Jest on oparty na prostszym algorytmie rozwiązującym ten sam problem, algorytmie Hoare’a.

Idea algorytmu

Załóżmy, że dany jest zbiór n liczb A, szukamy w nim k-tej liczby co do wielkości. Pomysł polega na ulepszeniu algorytmu Hoare’a, mianowicie na dokonaniu podziału względem sensownego elementu i to tym razem na trzy zbiory, mniejszych, równych oraz większych od wybranej liczby. Przypomnijmy, że algorytm Hoare’a polega na wybraniu losowego elementu, dokonaniu podziału zbioru A na elementy mniejsze lub równe od niego oraz na elementy większe od niego, a następnie rekurencyjne wywołanie algorytmu dla odpowiedniego z tych dwóch zbiorów. Idea algorytmu magicznych piątek polega na tym, żeby znaleźć w zbiorze A taki element, który zapewni podział na stosunkowo równe zbiory elementów mniejszych A< i większych A>.

Algorytm

Algorytm jest rekurencyjny. Dzielimy zbiór A na piątki liczb (ewentualnie ostatnia piątka jest niepełna) i spośród każdej piątki wybieramy medianę. Oznaczmy zbiór tych median przez A5. Następnie wywołujemy rekurencyjnie algorytm magicznych piątek dla pary A5,|A5|2, czyli innymi słowy szukamy w zbiorze A5 mediany, niech wynikiem będzie liczba m5.

Liczba m5 jest dobrym elementem do wykonania podziału. Zauważmy, że w zbiorze A, w każdej z piątek, której reprezentant okazał się mniejszy lub równy od m5, przynajmniej połowa (a w większości przypadków trzy piąte) elementów jest nie większa od m5. Zatem przynajmniej jedna czwarta liczb ze zbioru A jest nie większa od m5, analogicznie można uzasadnić, że przynajmniej jedna czwarta jest nie mniejsza.

Dokonujemy zatem podziału zbioru A na liczby mniejsze od m5 (zbiór A<), równe m5 (zbiór A=) oraz większe od niej (zbiór A>). Jeśli k|A<|, to wywołujemy rekurencyjnie algorytm magicznych piątek dla pary A<,k. W przeciwnym wypadku jeśli k|A<|+|A=|, to zwracamy m5 jako k-tą liczbę, a jeśli nie, to wywołujemy rekurencyjnie algorytm dla pary A>,k|A<||A=|.

Analiza złożoności

Niech T(n) oznacza złożoność czasową algorytmu. Zauważmy, że wykonanie algorytmu składa się z trzech kroków

  • znajdowania median piątek, wykonywanego w czasie Θ(n),
  • wybierania (rekurencyjnie) mediany zbioru A5, wykonywanego w czasie T(n5),
  • wykonania wywołania rekurencyjnego, wykonywanego co najwyżej w czasie T(max(|A<|,|A>|)).

Jak wcześniej zauważyliśmy max(|A<|,|A>|)3n4, zatem szacując czas wykonania całego algorytmu przez sumę maksymalnych czasów wykonań kroków, dostajemy nierówność

T(n)Θ(n)+T(n5)+T(3n4).

Stosując standardowe metody rozwiązywania nierówności asymptotycznych (kluczowe jest, że 15+34=1920<1) dostajemy, że algorytm magicznych piątek nawet pesymistycznie jest liniowy.

Bibliografia