2.2 Allgemeine (vergleichsbasierte) Sortierver

Werbung
2.2
Allgemeine (vergleichsbasierte) Sortierverfahren
Vergleichsbaum:
Der Aufbau des Verbleichsbaum ist für jeden Algorithmus und jede Eingabelänge n gleich.
Jede Permutation der Eingabe, muss zu einem anderen Blatt führen, sofern alle
Elemente verschieden sind. Dies führt zu einer Laufzeit ≥ n! Blätter.
Die Anzahl der Vergleiche ist im schlechtsten Fall gleich der Höhe des Vergleichsbaums. Also ist die Anzahl der Vergleiche ≥ log(Anzahl der Blätter) ≥ log (n!)
Die Abschätzen von n! ergibt Grob“ :
”
n! = 1 · 2 · 3 · . . . · n ≤ nn
Anderseits ist:
n! = 1 · 2 · 3 · . . . ·
n
2
j n k
+ 1 · ... · n ≥
+ 1 · ... · n ≥
{z
}
| 2
≥ n2
=⇒
n n2
2
n
2
n2
≤ n! ≤ nn
Es folgt
n n 2
n
n
n
n
log
= (log (n) − 1) = log (n) − ≤ log (n!) ≤ log (n) ≤ n log (n)
2
2
2
2
=⇒ log (n!) = Θ (n log (n))
Eine bessere Abschätzung für n! ist mit Hilfe der Stirlingschen Formel möglich.
Stirlingschen Formel wurde 1730 von James Stirling (1692-1770) entwickelt und
dient zur Berechnung von Näherungswerten großer Fakultäten.
n n
√
Θ
n! = 2πn ·
· e( 12n ) wobei 0 < Θ < 1
e
log (n!) = n log (n) − n log (e) +
18
1
1
log (n) + log (2π) + O (1)
2
2
= n log (n) − O (n)
(O (1) ist eine Funktion, die durch eine Konstante beschränkt ist.)
Daraus folgt: Jeder vergleichsbasierte Sortieralgorithmus benötigt zum Sortieren von n Elementen Ω (n log (n)) Vergleiche.
Genauer: Der Algorithmus benötigt im schlechtesten Fall mindestens
n log (n) − O (n) Vergleiche. Daher ist z.B. Mergesort im schlechtsten Fall asymptotisch (d.h. bis auf eine multiplikative Konstante) optimal für vergleichsbasierte Sortieralgorithmen.
Daraus kann man schließen, dass man nicht schneller Sortieren kann als mit
n log (n) Vergleichen.
2.3
Sortieren in linearer Zeit
Sortieren in linearer Zeit ist ausschließlich mit Sortierverfahren möglich, die
nicht nur auf Vergleichen beruhen und des weiteren nur für spezielle Universen
(Menge der Eingabedaten).
Sortieren durch Zählen (im endlichen Universum)
Voraussetzung: Universum ist endlich U = {a1 , a2 , . . . , ak }
1. Stelle k Zähler zur Verfügung
2. Durchlaufe die Eingabefolge
Zähle Anzahl der a1 en, a2 en, . . . , ak en
3. Dann i = 1, . . . , k
Gib so viele ai s aus wie gezählt wurden.
Laufzeit: θ (n) im EKM
Speicher: θ (k) mit k ist Größe des Universums U
2.3.1
Bucket Sort
Bucket Sort ist eine Verallgemeinerung des Sortierens in linearer Zeit. Die Idee
des Algorithmus besteht darin, das zu sortierende Intervall in gleichgroße Teilintervalle aufzuteilen, in so genannte Buckets“ und in dies dann die Elemente
”
einzusortieren.
Pseudocode für Bucket Sort
Gegeben: ein beliebiges Universum und eine Abbildung f : U → {1, . . . , r}.
Die Abbildung muss mit der Ordnungsrelation kompatibel sein, d.h. f (x) ≤
f (y) ⇒ x ≤ y (∀x, y ∈ U)
1. Stelle r Buckets“ (Listen) zur Verfügung.
”
19
2. Durchlaufe die Liste und berechen f (x) für alle Elemente x
und werfe“ x in bucket Nummer f (x).
”
Anschließend werden die Buckets“ intern mit Hilfe eines geeigneten Verfahren
”
sortiert und die Listen aus den buckets“ 1, 2, . . . , r hintereinander gehängt.
”
2.3.2
Radixsort
Das Radixsort Sortierverfahren basiert auf dem Bucket Sort Algorithmus.
Man
P
verwendet Radixsort für Wörter über einem endlichen Alphabet
= a1 , q2 , . . . , ak
Bsp.: Theoretisch
Radixsort beginnt
minimieren.
M ON
DIE
M IT
bräuchte man pro Schritt 26 Buckets, insgesamt also 263 .
die Buchstaben von hinten zu sortieren, um die Laufzeit zu
DIE
F RE
SAM
letzter
DON
F RI
SAM
SON
Buchstabe
−→
SAM
DIE
M IT
zweiter
M ON
DON
SON
M IT
Buchstabe
−→
DIE
DON
F RE
Erster
M ON
DON
SON
F RE
Buchstabe
−→
M IT
M ON
SAM
SON
Pseudocode für Radixsort
Eingabe: n Wörter w1 , . . . , wn der gleichen Länge l
1. FOR i = l, . . . , 1 DO Bucketsort bezüglich des i-ten Zeichen der Wörter
2. THEN konkateniere die Buckets in richtiger Reihenfolge. Dies kann verallgemeinert werden auf Wörter unterschiedlicher Länge.
Korrektheit: Zeige, dass die Worte nach dem i-ten Durchlauf bzgl. der i letzten
Zeichen lexikografisch sortiert sind. Beweis durch Induktion über i.
Laufzeit: Für l Durchläufe mit je Θ (n) Laufzeit, ergibt sich eine Gesamtlaufzeit
von Θ (l · n) = Θ (N ), wobei N = die Gesamtanzahl der Zeichen in der Eingabe,
l die Länge der Worte und n die Anzahl der Worte ist.
Man kann auch Zahlen mit diesem Algorithmus sortieren, dabei wird eine Darstellung der Zahlen bzgl. einer Basis gewählt und diese Zahlen werden dann wie
Worte sortiert. Dafür ergibt sich eine Laufzeit von insgesamt Θ (N ), wobei N
die Gesamtlänge aller Darstellungen ist.
20
2.4
Das Auswahlproblem (selection, order statistics)
Gegeben: Folge S der Länge n mit S ⊂ U und (U, ≤) sei ein linear geordnetes
Universum.
Finde: k-t-kleinstes Element von S (d.h. das Element, das an k-ter Stelle steht,
wenn S aufsteigend sortiert ist).
k = 1, dann M inimum
→ n − 1 V ergleiche
k = n, dann M aximum
Frage: Wie findet man das k = b n2 c Element, also genau den Median“?
”
Antwort: Folge sortieren und k-te Stelle ausgeben Θ (n · log (n)) z.B. Mergesort.
2.4.1
Randomisierter Algorithmus (randomized selection)
SELECT(k,S)
1. Falls |S| = 1 return a, mit S = {a}
2. Sonst
wähle zufällig (gleichverteilt) ein a ∈ S
3. Teile S auf in S1 (Elemente < a)
S2 (Elemente = a)
S3 (Elemente > a)
4. Falls |S1 | < k ≤ |n − S3 | return a
5. Sonst falls |S1 | ≥ k : return SELECT(k, S1 )
6. Sonst
return SELECT(k − (n − |S3 |), S3 )
Analyse: Die erwartete Laufzeit (im EKM der RAM) ist T (1) = b, wobei b
konstant ist.
Annahme: Das ausgewählte Element sei das i-t kleinste, falls i < k.
Wir durchsuchen rekursiv eine Folge der Größe n − 1 falls i > k.
Rekursiver Aufruf der Größe i − 1.
21
Damit folgt die Rekursion für T (n):
Pk−1
Pn
T (n) = n1 [ i=1 T (n − i) + i=k+1 T (n − 1) + c · n
Was wird summiert?
1. Teil der Summe: T (n − 1) + T (n − 2) + . . . + T (n − k + 1)
2. Teil der Summe: T (n − 1) + T (n − 2) + . . . + T (k)
3. Teil der Summe: Eine Konstante c für das Aufteilen
Annahme: n ≤ n2
Falls das helle“ Stück durch das dunkle“ ersetzt wird, wird die Summe asym”
”
ptotisch größer, da T (n) monoton wächst. Dies ist für den anderen Fall asymmetrisch.
Also gilt: P
n−1
T (n) ≤ n2 · i=b n c T (i) + c · n
2
Behauptung: T (n) = O(n) Beweis durch Induktion über n.
22
Herunterladen