Um den Median eines unsortierten Arrays zu finden, können wir einen Min-Heap in Zeit für n Elemente erstellen und dann eins nach dem anderen n / 2 Elemente extrahieren , um den Median zu erhalten. Dieser Ansatz würde jedoch O ( n log n ) Zeit in Anspruch nehmen .
Können wir dasselbe mit einer Methode in Zeit machen? Wenn wir können, wie dann?
Antworten:
Dies ist ein Sonderfall eines Auswahlalgorithmus , der das kleinste Element eines Arrays finden kann, wobei k die Hälfte der Größe des Arrays ist. Es gibt eine Implementierung, die im schlimmsten Fall linear ist.k k
Generischer Auswahlalgorithmus
Schauen wir uns zuerst einen Algorithmus ank
find-kth
, der das -kleinste Element eines Arrays findet:Die Funktion
split(A, pivot)
gibtL,R
so zurück, dass alle Elemente inR
größer sind alspivot
undL
alle anderen (minus eines Vorkommens vonpivot
). Dann wird alles rekursiv gemacht.Dies ist im Durchschnitt , aber O ( n 2 ) im ungünstigsten Fall.O ( n ) O ( n2)
Linearer Worst-Case: Der Median-of-Medians-Algorithmus
Ein besserer Pivot ist der Median aller Mediane von Subarrays der
A
Größe 5, indem die Prozedur für das Array dieser Mediane aufgerufen wird.Dies garantiert in allen Fällen . Es ist nicht so offensichtlich. Diese Powerpoint-Folien sind hilfreich, um sowohl den Algorithmus als auch die Komplexität zu erklären.O ( n )
Beachten Sie, dass die meiste Zeit mit einem zufälligen Pivot schneller ist.
quelle
5
Standard? Was ist, wenn die Größe von A kleiner als 5 ist?return A[k]
ist falsch (esA
sei denn, es ist sortiert, was den Algorithmus zur Diskussion bringen würde). Wenn essplit
passiert ist, teilen Sie sichA
so, dassk = |L| + 1
Sie immer noch nicht wissen, wo sich dask
th-Element befindet. Ihr Grundfall ist, wenn|A| = 1
Sie noch einen der beiden rekursiven Aufrufe durchführen müssen.Die Hauptidee des Algorithmus ist die Verwendung von Stichproben. Wir müssen zwei Elemente finden, die in der sortierten Reihenfolge des Arrays nahe beieinander liegen und zwischen denen der Median liegt. Eine vollständige Beschreibung finden Sie in der Referenz [MU2017].
[MU2017] Michael Mitzenmacher und Eli Upfal. "Wahrscheinlichkeit und Berechnung: Randomisierung und probabilistische Techniken in Algorithmen und Datenanalyse", Kapitel 3, Seiten 57-62. Cambridge University Press, Zweite Ausgabe, 2017.
quelle