Der übliche einfache Algorithmus zum Finden des Medianelements in einem Array mit n Zahlen ist:
- Probe - Elemente von A mit Ersatz in B
- Sortiere und finde den Rang | B | ± √ ElementelundrvonB.
- Stellen Sie sicher, dass sich und r auf gegenüberliegenden Seiten des Medians von A befinden und dass höchstens C √ vorhanden ist Elemente inAzwischenlundrfür eine geeignete KonstanteC>0. Scheitern Sie, wenn dies nicht geschieht.
- Andernfalls finden Sie den Median, indem Sie die Elemente von zwischen l und r sortieren
Es ist nicht schwer zu erkennen, dass dies in linearer Zeit abläuft und dass es mit hoher Wahrscheinlichkeit gelingt. (Alle schlechten Ereignisse sind große Abweichungen von der Erwartung eines Binomials.)
Ein alternativer Algorithmus für dasselbe Problem, der für Schüler, die eine schnelle Sortierung gesehen haben, natürlicher ist, ist der hier beschriebene: Zufällige Auswahl
Es ist auch leicht zu erkennen, dass dieser eine lineare erwartete Laufzeit hat: Sagen Sie, dass eine "Runde" eine Folge von rekursiven Aufrufen ist, die endet, wenn man eine 1 / 4-3 / 4-Aufteilung gibt, und beobachten Sie dann, dass die erwartete Länge von Eine Runde ist höchstens 2. (Bei der ersten Ziehung einer Runde beträgt die Wahrscheinlichkeit, einen guten Split zu erhalten, 1/2 und steigt dann tatsächlich an, da der Algorithmus so beschrieben wurde, dass die Rundenlänge von einer geometrischen Zufallsvariablen dominiert wird.)
Also jetzt die Frage:
Kann gezeigt werden, dass die randomisierte Auswahl mit hoher Wahrscheinlichkeit in linearer Zeit abläuft?
Wir haben Runden, und jede Runde hat eine Länge von mindestens k mit einer Wahrscheinlichkeit von höchstens 2 - k + 1 , so dass eine Vereinigungsgrenze ergibt, dass die Laufzeit O ( n log log n ) mit einer Wahrscheinlichkeit von 1 - 1 / ist. O ( log n ) .
Das ist irgendwie unbefriedigend, aber ist es tatsächlich die Wahrheit?
Antworten:
quelle